我需要在运行时创建身份表达式树,只返回它接收的参数。
在编译时我可以使用lambda e => e
作为表达式树,但我需要在运行时进行转换。我正在寻找与MS Expression Trees文章中num => num < 5
的表达式树类似的代码。
答案 0 :(得分:3)
这样做:
var param = Expression.Parameter(typeof(int), "e");
var body = param;
var lambda = Expression.Lambda<Func<int, int>>(body, param);
lambda.ToString()
的输出:
e => e
请注意,您需要为e
提供一种类型(在这种情况下,它是一个int)。
您所写的内容(e => e
)实际上已经是一个表达式树(如果定义为Expression<T>
,那就是)。但是,您可能希望使用工厂方法来构建树。
答案 1 :(得分:1)
e => e
。那就是它。
当然需要打字,例如对于整数,Expression<Func<int, int>> intTree = e => e;
,对于字符串Expression<Func<string, string>> stringTree = e => e;
,依此类推。
现在你已经从lambda获得了树,你可以检查它或者做你想要树的其他任何事情:
Console.WriteLine(intTree.Parameters[0].Name); // "e"
Console.WriteLine(intTree.CanReduce); // false
Func<int, int> intIdentityFunction = intTree.Compile();