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