2010-05-04 9 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 
} 

इस अवधारणा को एक eval() का उपयोग जावास्क्रिप्ट में kludged जा सकता है ... लेकिन इस विचार को एक पाश कि आगे या पीछे मूल्यों पर आधारित जा सकते है रनटाइम पर सेट करें।

क्या यह संभव है?

धन्यवाद

उत्तर

13

हाँ, यह नेट Expression trees. में है विशेष रूप से, आप BinaryExpression.Add() उपयोग करने के लिए की जरूरत है। भवन अभिव्यक्ति पेड़ों को हाथ से करने की आवश्यकता नहीं है, संकलक किसी भी लैम्ब्डा अभिव्यक्ति को परिवर्तित करने में प्रसन्न होगा, जिसे इसे 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

+0

func का उपयोग करना एक प्रतिनिधि को बाध्य एक अज्ञात फ़ंक्शन बना देगा। यह संकलन समय पर बनाया जाएगा। दूसरी तरफ अभिव्यक्ति के लिए लैम्ब्डा को आवंटित करने से कंपाइलर एक अभिव्यक्ति वृक्ष उत्सर्जित कर देता है जिसे रनटाइम पर छेड़छाड़ की जा सकती है। अनाम विधि नहीं कर सकते हैं। –

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

तो

op(i, l); 
2

संपादित करें: लैम्ब्डा समारोह के साथ जोड़ा गया है:

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

आप अपनी खुद की वर्ग को परिभाषित और अपने खुद के ऑपरेटर लागू कर सकते हैं, को देखने के http://msdn.microsoft.com/en-us/library/aa288467(VS.71).aspx

--edited
ओह, गलत समझा आप चाहते हैं, आपके लिए सबसे अच्छा तरीका अभिव्यक्ति या Func <> एंड्री उदास के रूप में उपयोग करना है।

संबंधित मुद्दे

 संबंधित मुद्दे