日期:2014-05-17  浏览次数:21066 次

如何用表达式树生成两个谓词以上的委托
如何用表达式树生成

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));

------解决方案--------------------
引用:
引用:
引用:引用:
唉!这是一个基本的离散数学概念。假设A+B得到的也是闭包,那么(A+B)+C也是。
如果操作符是恒定这样是没问题,但我  p>0 &amp;amp;amp;&amp;amp;amp; p<9 
------解决方案--------------------
 p==12 的操符是变动的。
我只是举一个例子,我想实现的是生成出来的表达式就……

带括号和不带括号只是人类阅读上的区别而已,事实上表达式树根本没有括号。

如果你愿意,你也可以画一个树或者用一个TreeView表示这个表达式。你可以做一个实验,在程序里面写(a+b)+c,或者(((a))+((((b)))))+c然后编译,再反编译,出来的都是a+b+c。也就是说,你没有办法从一个编译好的程序(或者一个表达式树)中分别源代码中你到底有没有写括号,因为这些写法产生的结果都是完全一样的。