Lambda到expression式树的转换

我会保持简单,

如何从lambda中获得expression式树?

或从查询expression式?

您必须将lambda分配给不同的types:

// Gives you a delegate: Func<int, int> f = x => x * 2; // Gives you an expression tree: Expression<Func<int, int>> g = x => x * 2; 

方法参数也是一样。 但是,一旦将这样的lambdaexpression式分配给Func<>types,就不能得到expression式树。

康拉德的回答是确切的。 您需要将lambdaexpression式分配给Expression<Func<...>>以便编译器生成expression式树。 如果你得到一个Func<...>Action<...>或其他委托types的lambda,那么你所拥有的只是一堆IL指令。

如果你真的需要能够将IL编译的lambda转换回expression式树,你必须反编译它(例如做Lutz Roeder的Reflector工具)。 我build议看一下Cecil库,它提供了先进的IL操作支持,可以为你节省一些时间。

为了扩大Konrad的答案,为了纠正Pierre,你仍然可以从IL编译的lambda生成一个expression式,虽然它不是非常优雅。 增加Konrad的例子:

 // Gives you a lambda: Func<int, int> f = x => x * 2; // Gives you an expression tree: Expression<Func<int, int>> g = x => f(x);