首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Func或Predicate to ExpressionTree

Func或Predicate to ExpressionTree
EN

Stack Overflow用户
提问于 2010-08-10 20:06:02
回答 4查看 1.1K关注 0票数 3

假设我有:

代码语言:javascript
复制
 Func<Customer,bool > a = (c) => c.fullName == "John";

现在,我想要转换为expressiontree,有什么方法可以做到吗?

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

示例:

代码语言:javascript
复制
        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); 

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

代码语言:javascript
复制
ExpressionTree<Func<Customer,bool >>

它会给出编译时错误

提前感谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-10 20:32:21

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

根据您正在尝试做的事情,也许您可以解决一个不完整的解决方案:创建一个调用委托的表达式树。因为我对你想要传递表达式树的方法一无所知,所以我不知道这对你来说是不是一个可行的解决方案。

摘要:如果您想要所有表达式的完整表达式树,则需要确保它们从一开始就是表达式树。一旦你把它编译成委托,表达式树就会丢失。

一旦你确定它们是表达式树,你就可以像下面这样将它们组合在一起:

代码语言:javascript
复制
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);

当然,这使用了AndAlso运算符(&&);您也可以将OrElse用于||等。

票数 5
EN

Stack Overflow用户

发布于 2010-08-10 20:34:13

你可以从表达式转到Func,但不能反过来。

您可以这样做:

代码语言:javascript
复制
Expression<Func<Customer, bool>> exprA = (c) => c.fullName == "John";
Func<Customer, bool> funcA = exprA.Compile();

但是没有办法走另一条路。

票数 2
EN

Stack Overflow用户

发布于 2010-08-10 21:00:00

关于你修改后的问题,我认为这是可行的:

代码语言:javascript
复制
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.And(ai, bi), cp);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3448700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档