Che*_*hen 8 .net c# linq lambda expression-trees
既然我们可以:
Expression<Func<int, bool>> predicate = x => x > 5;
var result = Enumerable.Range(0,10).Where(predicate.Compile());
Run Code Online (Sandbox Code Playgroud)
我怎么能够:
Func<int,bool> predicate = x => x > 5;
Expression<Func<int,bool>> exp = predicate.Decompile();
Run Code Online (Sandbox Code Playgroud)
也就是说,我想得到相应Expression的Func.可能吗?
委托实例没有神奇之处Decompile(),没有解构IL(可能使用mono.cecil).如果你想要一个表达式树,你必须从一个表达式树开始,所以请通过表达式.Expression<Func<int, bool>>
作为边缘情况,您可以从委托()和()获取基本方法委托信息- 但是,对于涉及lambda或匿名方法的大多数情况,这将指向捕获类上的compiler-generate方法,因此赢了真的很帮助你.它几乎局限于以下场景:.MethodMethodInfo.Targetarg0
Func<string,int> parse = int.Parse;
Run Code Online (Sandbox Code Playgroud)
将lambda传递给接受Expression <>的方法,C#编译器将在运行时传递表达式树.但是,这仅在您直接传递lambda时有效,而不是在尝试传递从lambda创建的委托实例时.
var exp = Decompile(x => x > 5);
public Expression<Func<int, bool>> Decompile(Expression<Func<int, bool>> exp)
{
return exp;
}
Run Code Online (Sandbox Code Playgroud)
我已经找到了反编译委托实例最接近的选项是详细这从让-巴蒂斯特Evain博客文章谁在工作单的球队.他使用优秀的Mono.Cecil项目将IL反编译为自定义AST,然后将其尽可能地映射到LINQ表达式中.