转换表达式<func <t,u =“”>&gt;表达式<func <object,object =“”>&gt;

时间:2017-04-13 08:30:04

标签: c# lambda expression-trees

我的ToString()类型为LambdaExpression。代码的设计目前不允许我保留Expression<Func<T, string>>,这意味着我被迫使用较慢的T代替DynamicInvoke

因为我知道Invoke的类型我要转换表达式以便它接受T对象,允许我使用T。怎么样?

这是一个好的开始

Invoke

1 个答案:

答案 0 :(得分:4)

非表达式版本看起来像

Func<object, object> Convert<T>(Func<T, object> f) {
  return o => f((T)o);
}

这也是您在表达式版本中需要做的事情。你是对的,Expression.Convert可以做到这一点。

Expression<Func<MyClass, object>> e1 = t => t.MyProperty;
var p = Expression.Parameter(typeof(object));
var e2 = Expression.Lambda<Func<object, object>>(
    Expression.Invoke(e1, Expression.Convert(p, typeof(MyClass))), p);

注意:正如@xanatos正确指出的那样, Expression<Func<T, int>>Expression<Func<object, object>>,虽然C#支持从intobject的隐式装箱转换,但表达式树不支持。如果这与问题相关,则需要另一个Expression.Convert