表达式的Func或Predicate

Sta*_*ker 3 c# linq lambda predicate

让我们说:

 Func<Customer,bool > a = (c) => c.fullName == "John";
Run Code Online (Sandbox Code Playgroud)

现在我想转换为表情树以任何方式做到这一点?

我知道我可以从第一个地方定义它作为expressiontree但我的情况是不同的,因为我必须先连接一些lambda表达式然后将它传递给一个采用expressiontree的方法,这样做会导致编译时错误!

例:

        Func<Customer, bool> a = (c) => c.fullName == "John";
        Func<Customer, bool> b = (c) => c.LastName == "Smith";
        Func<Customer, bool> final = c => a(c) && b(c); 
Run Code Online (Sandbox Code Playgroud)

现在我想将final传递给一个需要的方法

ExpressionTree<Func<Customer,bool >>
Run Code Online (Sandbox Code Playgroud)

它给出了编译时错误

提前致谢

Tim*_*mwi 5

你不能这样做.类型的变量Func<...>委托,它基本上类似于指向包含lambda表达式的已编译代码的内存位置的指针..NET中没有将已编译的代码转换回表达式树的功能.

根据您的尝试,您可能会遇到一个不完整的解决方案:创建一个调用委托的表达式树.由于我对你想要传递表达式树的方法一无所知,所以我不知道这对你来说是否是一个可行的解决方案.

简介:如果需要所有表达式的完整表达式树,则需要确保它们从一开始就是表达式树.只要将其编译为委托,表达式树就会丢失.

一旦确定它们是表达式树,就可以使用以下内容组合它们:

Expression<Func<Customer, bool>> a = c => c.FullName == "John";
Expression<Func<Customer, bool>> b = c => c.LastName == "Smith";

var cp = Expression.Parameter(typeof(Customer), "c");

var ai = Expression.Invoke(a, cp);
var bi = Expression.Invoke(b, cp);

var final = Expression.Lambda<Func<Customer, bool>>(
    Expression.AndAlso(ai, bi), cp);
Run Code Online (Sandbox Code Playgroud)

当然,这使用AndAlsooperator(&&); 你也可以使用OrElse||