我有一个
既然我知道了
以下是一个很好的起点。
LambdaExpression
的类型是 Expression<Func<T, string>>
。目前代码的设计不允许我保留 T
,这意味着我被迫使用更慢的 DynamicInvoke
而非 Invoke
。既然我知道了
T
的类型,我想把表达式转换成接受 T
对象的表达式,从而可以使用 Invoke
。怎么办?以下是一个很好的起点。
class Program
{
class MyClass
{
public string MyProperty => "Foo";
}
static LambdaExpression GetExpression(Expression<Func<MyClass, object>> expr)
{
return expr;
}
static void Main(string[] args)
{
var e1 = GetExpression(t => t.MyProperty);
var e2 = Expression.Lambda<Func<object, object>>(e1, e1.Parameters);
object myClass = new MyClass();
string s1 = (string)e1.Compile().DynamicInvoke(myClass);
object s2 = e2.Compile().Invoke(myClass);
}
}
Func<T, U>
转换为Func<object, object>
,还是将Func<T, object>
转换为Func<object, object>
,还是将Expression<Func<T, object>>
转换为Expression<Func<object, object>>
? 这三个问题都有不同的答案。 - user743382Expression.Convert
。 - l33t