2009-02-28 16 views
21

Making reflection fly and exploring delegates के बारे में प्रश्न ...Delegate.CreateDelegate बनाम DynamicMethod बनाम अभिव्यक्ति

मैं गतिशील लोड प्रकार मैं संभवतः इस्तेमाल कर सकते हैं पर तरीकों के प्रतिनिधियों Func<T, TResult> बनाने की आवश्यकता है (1) Delegate.CreateDelegate (2) DynamicMethod (3) Expression पेड़ ।

आइए गतिशील रूप से लोड किए गए प्रकार/विधियों का सेट कॉन्फ़िगर के माध्यम से एप्लिकेशन स्टार्टअप पर एक बार दिखाई देता है और ऐप के पूरे जीवनकाल में उपयोग किया जाता है (स्टार्ट-अप प्रदर्शन एक मुद्दा नहीं है और न ही स्मृति है), प्रतिनिधियों को कैश किया जाता है और दृढ़ता से टाइप किए गए तरीके से प्रेषित किया गया। ये प्रतिनिधि गर्म पथों को समवर्ती रूप से एक्सेस करते हैं।

आप कौन सी गतिशील बाध्यकारी विधि पसंद करेंगे और क्यों?

उत्तर

19

वे वास्तव में तरीकों जो आप के लिए एक MethodInfo है मौजूदा रहे हैं, और वे सही हस्ताक्षर है, तो मैं कहेंगे Delegate.CreateDelegate जाने के लिए सही तरीका है - यह है कि वास्तव में आप क्या चाहते हैं, कोई उपद्रव के साथ। मैं DynamicMethod या अभिव्यक्ति पेड़ का उपयोग करता हूं यदि मुझे किसी तर्क को निष्पादित करने के लिए एक प्रतिनिधि बनाने की आवश्यकता होती है जो किसी विधि में पहले से ही कब्जा नहीं किया गया था।

अभिव्यक्ति पेड़ (IMO, और मैं गुस्से में DynamicMethod इस्तेमाल नहीं किया है) कर रहे हैं थोड़ा DynamicMethod से उपयोग करने के लिए आसान है, लेकिन वे अधिक प्रतिबंधित कर रहे हैं - मूल रूप से वे केवल एक ही अभिव्यक्ति (जिनमें से, एक और तरीका कह सकते हैं प्रतिनिधित्व कर सकते हैं पाठ्यक्रम)। DynamicMethod आपको बहुत लचीलापन देता है, लेकिन आपको आईएल को उचित रूप से समझने की आवश्यकता है।

क्या इससे मदद मिलती है?

+3

गतिशील तरीकों रॉक जब आप उन्हें काम करने के लिए मिलता है। उन्हें काम करने के लिए हालांकि अक्सर आईएल, निराशा और चतुरता के साथ झुकाव में बहुत से अभिनीत शामिल हैं। लेकिन वे शानदार परिणाम देते हैं। – JaredPar

+0

यह मेरे विचारों को भी पुष्टि करता है। प्रतिनिधियों के आस-पास घूमते हुए ऐसा लगता है कि इस समस्या को हल करने के लिए कुछ लोग डायनामिक मोड का उपयोग कर रहे हैं। मेरे पास एक ऐप है जो मैंने वर्णन किए तरीके में प्रतिनिधि का निर्माण किया है। – jsw

5

आईएंडे के ब्लॉग के माध्यम से मुझे यह दिलचस्प लिंक मिला जो डायनामिक तरीके से आप किस तरह की चीजें कर सकते हैं। एक उदाहरण के रूप में यह काफी समझा जा सकता है:
Accelerating Enum-Based Dictionaries with Generic EnumComparer

अद्यतन

एक नोट करना चाहिए कि WinRT की दुनिया में, Reflection.Emit अनुपलब्ध है - कुछ जानकारी पाया जा सकता है here

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