我会保持简单,
如何从lambda中获取表达式树?
还是来自查询表达式?
答案 0 :(得分:56)
您必须将lambda分配给其他类型:
// Gives you a delegate:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;
方法参数也是如此。但是,一旦将这样的lambda表达式分配给Func<>
类型,就无法恢复表达式树。
答案 1 :(得分:10)
Konrad的回复是准确的。您需要将lambda表达式分配给Expression<Func<...>>
,以便编译器生成表达式树。如果你得到一个lambda作为Func<...>
,Action<...>
或其他委托类型,你所拥有的只是一堆IL指令。
如果你真的需要能够将IL编译的lambda转换回表达式树,你必须对它进行反编译(例如,做Lutz Roeder的Reflector工具)。我建议看一下Cecil库,它提供高级的IL操作支持,可以节省你很多时间。
答案 2 :(得分:7)
为了扩展康拉德的答案,并纠正皮埃尔,你仍然可以从IL编译的lambda中生成一个表达式,尽管它不是非常优雅。增加康拉德的例子:
// Gives you a lambda:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);