Lambda到Expression树的转换

时间:2009-08-21 08:40:24

标签: c# lambda expression-trees

我会保持简单,

如何从lambda中获取表达式树?

还是来自查询表达式?

3 个答案:

答案 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);