假设我有:
Func<Customer,bool > a = (c) => c.fullName == "John";现在,我想要转换为expressiontree,有什么方法可以做到吗?
我知道我可以从一开始就将它定义为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); 现在,我想将final传递给一个方法,该方法需要
ExpressionTree<Func<Customer,bool >>它会给出编译时错误
提前感谢
发布于 2010-08-10 20:32:21
你不能这么做。类型为Func<...>的变量是一个委托,它基本上类似于指向内存位置的指针,该内存位置包含用于λ表达式的编译代码。.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);当然,这使用了AndAlso运算符(&&);您也可以将OrElse用于||等。
发布于 2010-08-10 20:34:13
你可以从表达式转到Func,但不能反过来。
您可以这样做:
Expression<Func<Customer, bool>> exprA = (c) => c.fullName == "John";
Func<Customer, bool> funcA = exprA.Compile();但是没有办法走另一条路。
发布于 2010-08-10 21:00:00
关于你修改后的问题,我认为这是可行的:
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);https://stackoverflow.com/questions/3448700
复制相似问题