Expression.Quote
निर्दिष्ट करता है कि एक लैम्ब्डा को एक अभिव्यक्ति वृक्ष के रूप में माना जाना चाहिए, न कि एक समारोह के रूप में। यह अपने ऑपरेंड पर बंद अर्थशास्त्र को प्रेरित करता है।
जब आप एक MethodCallExpression
Expression.Call
का उपयोग कर निर्माण कर रहे हैं, किसी भी पैरामीटर लैम्ब्डा भाव (LambdaExpression
/Expression<TDelegate>
), Expression.Quote
का उपयोग में पार करने से पहले पैरामीटर रैप करने के लिए आवश्यक है।
तो प्रकार Expression<Func<bool>>
की एक पैरामीटर के लिए जब आप बना रहे हैं एक उदाहरण के रूप में: () => true
, अभिव्यक्ति की Type
संपत्ति जबकि अभिव्यक्ति के प्रकार (GetType
बुला) Func<bool>
होगा Expression<Func<bool>>
तो एकप्राप्त करने के लिए किया जाएगाजिसमें Type
संपत्ति के लिए सही मान है, आप Expression.Quote
में लैम्ब्डा अभिव्यक्ति को पास करते हैं और Expression.Call
पर पैरामीटर के रूप में पास करते हैं।
मैं परावर्तक के माध्यम से Expression.Quote
पर एक नज़र था और जबकि एकमात्र पैरामीटर प्रकार Expression
की है, यह LambdaExpression
से निकाले जाते हैं चाहिए और इस विधि के अंदर चेक किया गया है। ब्याज से, किसी को पता है कि एमएस ने पैरामीटर प्रकार को LambdaExpression
क्यों नहीं बनाया?
स्टीवनएच ने बताया, Expression.Quote
का उपयोग LINQ क्वेरी प्रदाता को लागू करने में किया जाता है। Queryable
पर सभी तरीकों कि एक लैम्ब्डा अभिव्यक्ति इस तरह के Where
, OrderBy
, GroupBy
, आदि के रूप में आंतरिक रूप से Expression.Call
का उपयोग कर एक MethodCallExpression
का निर्माण और Expression.Quote
कॉल के साथ लैम्ब्डा अभिव्यक्ति मापदंडों लपेट ले।
Expression.Quote
के एक और विस्तृत स्पष्टीकरण के लिए यह answer पढ़ें।
"जब आप Expression.Call का उपयोग करके MethodCallExpression का निर्माण कर रहे हैं, तो लैम्ब्डा अभिव्यक्तियों (LambdaExpression/अभिव्यक्ति) के किसी भी पैरामीटर को अभिव्यक्ति का उपयोग करना चाहिए। पास करने से पहले पैरामीटर को लपेटने के लिए उद्धरण।" क्या यह सच है? .NET 4.5 का उपयोग करके, मैं अभिव्यक्ति के साथ पहले उद्धरण की आवश्यकता के बिना नंगे अभिव्यक्ति > सफलतापूर्वक पारित करने में सक्षम हूं। –
यदि आपका पैरामीटर 'Func <>' प्रकार है, तो सुनिश्चित करें कि आपको केवल इतना ही चाहिए, लेकिन कई LINQ 'IQueryable' एक्सटेंशन विधियों के मामले में, पैरामीटर प्रकार वास्तव में 'अभिव्यक्ति >' है, और उस स्थिति में आपको 'Expression.Quote' की आवश्यकता होगी। मैंने .NET 4.5 के साथ ऐसा करने की कोशिश नहीं की है, लेकिन मुझे लगता है कि यह वही था। लिखने के समय मैं शायद .NET 3.5 का उपयोग कर रहा था। –
GiddyUpHorsey