2010-05-04 102 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 
     } 
相關問題