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)
它给出了编译时错误
提前致谢
你不能这样做.类型的变量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的||等
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |