我的ToString()
类型为LambdaExpression
。代码的设计目前不允许我保留Expression<Func<T, string>>
,这意味着我被迫使用较慢的T
代替DynamicInvoke
。
因为我知道Invoke
的类型我要转换表达式以便它接受T
对象,允许我使用T
。怎么样?
这是一个好的开始
Invoke
答案 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#支持从int
到object
的隐式装箱转换,但表达式树不支持。如果这与问题相关,则需要另一个Expression.Convert
。