【发布时间】:2018-06-08 12:49:59
【问题描述】:
我需要在运行时创建只返回它接收到的参数的身份表达式树。
在编译时我可以使用 lambda e => e 作为表达式树,但我需要在运行时进行转换。我正在寻找类似于在 MSDN Expression Trees 文章中构造 num => num < 5 的表达式树的代码。
【问题讨论】:
标签: c# asp.net linq expression-trees
我需要在运行时创建只返回它接收到的参数的身份表达式树。
在编译时我可以使用 lambda e => e 作为表达式树,但我需要在运行时进行转换。我正在寻找类似于在 MSDN Expression Trees 文章中构造 num => num < 5 的表达式树的代码。
【问题讨论】:
标签: c# asp.net linq expression-trees
这样就可以了:
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>,就是这样)。但是,您可能希望使用工厂方法来构建树。
【讨论】:
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();
【讨论】: