2010-05-04 5 views
7

Ich möchte folgendes tun:Gibt es eine .NET-Klasse, die Operator-Typen darstellt?

*OperatorType* o = *OperatorType*.GreaterThan; 

int i = 50; 

int increment = -1; 

int l = 0; 

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

dieses Konzept in Javascript mit einem eval() kludged werden ... aber diese Idee ist es, eine Schleife haben , die vorwärts oder rückwärts basierend auf Werten gehen zur Laufzeit gesetzt.

ist das möglich?

Dank

Antwort

13

Ja, es Expression trees. Insbesondere in .NET ist, müssen Sie BinaryExpression.Add() verwenden. Das Erstellen von Ausdrucksbaumstrukturen muss nicht von Hand erfolgen. Der Compiler konvertiert alle Lambda-Ausdrücke, die er als Expression<T> erkannt hat, in einen gültigen Ausdrucksbaum.

Wenn Sie Ihren Ausdrucksbaum aufrufen, wird er automatisch zu einer dynamischen Methode kompiliert und größer wird als ein Delegierter fungieren.

+0

Was ist der Grund, Expression anstelle nur der einfachen Func-Delegate zu verwenden? – fearofawhackplanet

+0

Mit Func erstellen Sie einfach eine an einen Delegaten gebundene anonyme Funktion. Es wird zur Kompilierzeit erstellt. Die Zuweisung des Lambda zu Expression bewirkt andererseits, dass der Compiler einen Ausdrucksbaum aussendet, der zur Laufzeit manipuliert werden kann. Die anonyme Methode kann nicht. –

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

dann

op(i, l); 
2

Edit: Added eine mit Lambda-Funktion:

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

     } 
    } 

Ich bin sicher, dass Menschen mit viel elegantere Lösungen als diese wird kommen, aber hier es ist:

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 
     } 

oder ganz von l loszuwerden:

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

     int i = 50; 

     int increment = -1; 

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