我有一个LambdaExpression
,它是Expression<Func<T, string>>
类型。代码的设计目前不允许我继续T
这意味着我不得不使用较慢的DynamicInvoke
,而不是Invoke
。将表达式<Func<T, U>>转换为表达式<Func <object,object >>
因为我知道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键'来'Func键<对象,对象>'转换'Func键'来'Func键<对象,对象>',或转换'表达>'来'表达'?这三个人都有不同的答案。 –
hvd
我可以编写一些代码来解决这个问题...只有一个问题...你想使用这些表达式实体框架/ LINQ to SQL,或者你想简单地编译这些表达式吗?因为改变'Expression'使它们成为'Func
更新了问题。最后,我想编译表达式以用作类型化委托,以便我可以使用Invoke()而不是DynamicInvoke()。我相信'Expression.Convert'是需要某种方式。 – l33t