【发布时间】:2017-04-13 08:30:04
【问题描述】:
我有一个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>>?这三个人都有不同的答案。 -
我可以编写一些代码来解决这个问题...只是一个问题...您想将这些表达式用于 Entity Framework/LINQ to SQL 还是简单地编译这些表达式?因为将
Expressions 更改为Func<object, object>可能会使它们与EF 不兼容。 -
更新了问题。最后,我想编译表达式以用作类型化委托,这样我就可以使用 Invoke() 而不是 DynamicInvoke()。我相信在某种程度上需要
Expression.Convert。
标签: c# lambda expression-trees