2010-05-04 23 views
7

我想做到以下几点:是否有表示运算符类型的.NET类?

*OperatorType* o = *OperatorType*.GreaterThan; 

int i = 50; 

int increment = -1; 

int l = 0; 

for(i; i o l; i = i + increment) 
{ 
    //code 
} 

这个概念可以使用JavaScript中的eval()函数来kludged ......只是这种想法是有一个循环 可以向前或向后基于价值在运行时设置。

这是可能的吗?

感谢

回答

13

是的,它在.NET Expression trees.具体而言,您需要使用BinaryExpression.Add()。构建表达式树不需要手工完成,编译器会很乐意将它看到的任何lambda表达式转换为Expression<T>转换为有效的表达式树。

// Creating an expression tree. 
Expression<Func<int, int, bool>> greaterThan = (l, r) => l > r; 

int i = 50; 

int increment = -1; 

int l = 0; 

for(i; greaterThan(o, i); i = i + increment) 
{ 
    //code 
} 

调用表达式树会自动将其编译为动态方法,并且greaterThan将像代理一样有效地执行。

+0

什么原因使用表达式而不是只是普通的Func委托? – fearofawhackplanet 2010-05-04 17:53:14

+0

使用func只会创建一个绑定到委托的匿名函数。它将在编译时构建。另一方面,将lambda分配给Expression会导致编译器发出可在运行时操作的表达式树。匿名方法不能。 – 2010-05-05 08:02:09

4
Func<int,int,bool> op = (i1, i2) => i1 > i2; 

然后

op(i, l); 
2

编辑:增加了一个具有lambda表达式:

Func<int, int, bool> lessThan = (num1, num2) => num1 < num2; 
    Func<int, int, bool> greaterThan = (num1, num2) => num1 > num2; 
    public void Run() 
    { 
     int increment = -1; 
     int l = 0; 
     Func<int, int, bool> c = lessThan; 
     for (int i = 50; c(i, l); i = i + increment) 
     { 

     } 
    } 

我相信人们会想出比这更优雅的解决方案,但在这里它是:

public enum Comparison 
    { 
     GreaterThan, 
     LessThan 
    } 
    public bool Compare(int a, Comparison c, int b) 
    { 
     if (c == Comparison.GreaterThan) 
      return a > b; 
     else if (c == Comparison.LessThan) 
      return a < b; 
     else 
      throw new ArgumentException(); 
    } 

    public void Run() 
    { 
     int i = 50; 
     int increment = -1; 
     int l = 0; 
     Comparison c = Comparison.GreaterThan; 
     for (i; Compare(i, c, l); i = i + increment) 
     { 

     } 
    } 
1
 Func<int, int, bool> o = (x, y) => x > y; 

     int i = 50; 

     int increment = -1; 

     int l = 0; 

     for(; o(i, l) ; i = i + increment) 
     { 
      //code 
     } 

或得到完全摆脱升:

 Predicate<int> o = (x) => x > 0; 

     int i = 50; 

     int increment = -1; 

     for(; o(i) ; i = i + increment) 
     { 
      //code 
     } 
相关问题