在运行时构造身份(e => e)作为表达式树

时间:2016-03-29 23:30:43

标签: c# asp.net linq expression-trees

我需要在运行时创建身份表达式树,只返回它接收的参数。

在编译时我可以使用lambda e => e作为表达式树,但我需要在运行时进行转换。我正在寻找与MS Expression Trees文章中num => num < 5的表达式树类似的代码。

2 个答案:

答案 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();
相关问题