2010-05-04 20 views
7

ben aşağıdakileri yapmak istiyorum:Operatör türlerini temsil eden bir .NET sınıfı var mı?

*OperatorType* o = *OperatorType*.GreaterThan; 

int i = 50; 

int increment = -1; 

int l = 0; 

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

bu kavram, bir değerlendirme() kullanarak javascript kludged olabilir ... ama bu fikir değerlerine dayalı ileri veya geri gidebilir bir döngü sahip olmaktır çalışma zamanında ayarlayın.

Bu mümkün mü?

cevap

13

Evet, .NET Expression trees. öyle

Teşekkür Özellikle, BinaryExpression.Add() kullanmak gerekir. İfade ağaçlarının el ile yapılması gerekmez, derleyici geçerli bir İfade ağacına Expression<T> atanmış gördüğü herhangi bir lambda ifadesini dönüştürmekten mutluluk duyar.

// 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 
} 

ifadeniz ağacı çağırma otomatik dinamik yöntemle içine derlemek ve GreaterThan etkili temsilci gibi hareket edecektir.

+0

Sadece düz Func delegesi yerine Expression 'u kullanmanın nedeni nedir? – fearofawhackplanet

+0

Func kullanmak yalnızca bir temsilci ile ilişkilendirilmiş anonim bir işlev oluşturur. Derleme zamanında yapılacaktır. Diğer taraftan lambda'nın İfade'ye atanması, derleyicinin çalışma zamanında yönetilebilen bir ifade ağacı yaymasına neden olur. Anonim yöntem olamaz. –

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

sonra

op(i, l); 
2

Düzenleme: lambda fonksiyonu ile Eklendi tek:

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

     } 
    } 

Eminim insanlar burada bundan çok daha zarif çözümler gelebilir, ancak değilim öyledir:

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 
     } 

veya tamamen l kurtulmak:

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

     int i = 50; 

     int increment = -1; 

     for(; o(i) ; i = i + increment) 
     { 
      //code 
     } 
İlgili konular