2013-02-16 50 views
5

मैं इस तरह एक समारोह है:कैसे अभिव्यक्ति करने के लिए समारोह <T,bool> कन्वर्ट करने के लिए <Func<T,bool>>

Func<MyClass, bool> func = x=>Id == 5; 

मैं इसे कैसे करने के लिए परिवर्तित कर सकते हैं:

Expression<Func<MyClass, bool>> 
+1

अभिव्यक्ति एक लैम्ब्डा फ़ंक्शन का इंटरमीडिएट प्रतिनिधित्व है। Func संकलित lambda समारोह स्वयं है। ऐसा मत सोचो कि आप दोनों के बीच बदल सकते हैं। आपको ऐसा करने की ज़रूरत क्यों है? – akhisp

उत्तर

3

इस प्रयास करें:

Func<MyClass, bool> func = x=>Id == 5; 
Expression<Func<MyClass, bool>> expr = mc => func(mc); 
+1

यह वास्तव में एक प्रतिनिधि को कॉल करने के लिए 'expr' सेट करता है जो' MyClass' लेता है और 'बूल' देता है। 'expr' वास्तविक lambda के लिए एक वाक्यविन्यास पेड़ नहीं होगा। – Sean

+0

हां, यह है। तो क्या? शायद सवाल का लेखक बस यही होना चाहिए। – Memoizer

+1

इसे उत्तर स्वीकार नहीं किया जाना चाहिए। विधि अभिव्यक्ति में परिवर्तित नहीं किया जाता है। –

2

आप एक अभिव्यक्ति बना सकते हैं जो आपके द्वारा बनाए गए प्रतिनिधि को कॉल का प्रतिनिधित्व करता है। लेकिन अधिकांश समय, जब आप Expression एस का उपयोग कर रहे हैं, तो आप यह समझने के लिए करते हैं कि कोड क्या करता है (उदा। इसे SQL में परिवर्तित करने के लिए)। और आप एक अपारदर्शी फ़ंक्शन का आह्वान करने के लिए अभिव्यक्ति के साथ ऐसा नहीं कर सकते हैं।

9

तुम बस लिख सकते हैं:

Expression<Func<MyClass,bool>> expr = x=>Id == 5; 

यह expr सेट हो जाएगा Id == 5 के लिए एक अभिव्यक्ति पेड़ होने के लिए।

यदि आप कार्य करें:

Func<MyClass, bool> func = x=>Id == 5; 
Expression<Func<MyClass, bool>> expr = mc => func(mc); 

फिर इस expr सेट हो जाएगा func के लिए एक कॉल के लिए एक अभिव्यक्ति पेड़ होने के लिए, func के शरीर के लिए नहीं एक अभिव्यक्ति पेड़।

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

  • कोई संबंधित समस्या नहीं^_^