反向表达式<Func <T,TResult >>.编译()?

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)

也就是说,我想得到相应ExpressionFunc.可能吗?

Mar*_*ell 7

委托实例没有神奇之处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)


Nat*_*lch 5

将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表达式中.