如何用表达式树生成两个谓词以上的委托
如何用表达式树生成
Func<int,bool> f = (p)=>{ return p>0 && p<9 || p==12};
这样的委托?
Expression.And 只能传入两个条件,我想一次传入两个以上的条件 。
[解决办法]
var par = Expression.Parameter(typeof(int), "p");
var left = Expression.AndAlso(Expression.GreaterThan(par, Expression.Constant(0)), Expression.LessThan(par, Expression.Constant(9)));
var right = Expression.Equal(par, Expression.Constant(23));
var s = Expression.Lambda(Expression.OrElse(left, right), par);
Console.WriteLine((s.Compile() as Func<int,bool>)(2));
[解决办法]
带括号和不带括号只是人类阅读上的区别而已,事实上表达式树根本没有括号。
如果你愿意,你也可以画一个树或者用一个TreeView表示这个表达式。你可以做一个实验,在程序里面写(a+b)+c,或者(((a))+((((b)))))+c然后编译,再反编译,出来的都是a+b+c。也就是说,你没有办法从一个编译好的程序(或者一个表达式树)中分别源代码中你到底有没有写括号,因为这些写法产生的结果都是完全一样的。