2010-06-11 16 views
6

के माध्यम से प्रतिनिधि बनाएं एक विधानसभा किप्रतिबिंब

namespace Foo{public class Bar;} 

शामिल मैं संकलन समय पर पहले विधानसभा के संदर्भ के बिना एक और विधानसभा से एक Action<Foo.Bar> बना सकते हैं कैसे देखते हुए?

+1

क्या आप "पहले विधानसभा के संदर्भ के बिना" द्वारा मतलब है? यदि आप उस असेंबली से किसी प्रकार का उपयोग करना चाहते हैं तो आपको इसे किसी भी तरह से संदर्भित करना होगा। – LukeH

+0

क्षमा करें, मेरा मतलब है कि इसे विजुअल स्टूडियो प्रोजेक्ट के संदर्भ के रूप में जोड़ना। यानी इसे लोड करने के लिए Assembly.LoadFrom() का उपयोग करें ताकि कोई संकलन-समय निर्भरता न हो। – dss539

+0

@LukeH - थोड़ा सा स्पष्ट होने के लिए संपादित प्रश्न। इनपुट के लिए धन्यवाद। – dss539

उत्तर

10

तो आप का उपयोग

Type barType = Type.GetType("Foo.Bar, whateverassembly"); 
Type actionType = typeof(Action<>).MakeGenericType(barType); 

actionType अब Action<Foo.Bar> का प्रतिनिधित्व करेंगी। हालांकि, इसका उपयोग करने के लिए, आपको प्रतिबिंब का उपयोग करने के लिए contintue की आवश्यकता होगी, इसलिए आपको MethodInfo मिलना होगा जो हस्ताक्षर void(Foo.Bar) पर हस्ताक्षर करता है, और एक प्रतिनिधि बनाने के लिए Delegate.CreateDelegate पर कॉल करें। और इसे निष्पादित करने के लिए आपको Delegate.DynamicInvoke की आवश्यकता होगी।

Delegate call = Delegate.CreateDelegate(actionType, ...); 
... 
call.DynamicInvoke(someBar); 

कुछ मुझसे कहता है कि क्या आप की सोच रहे हैं नहीं है ...

+0

मैं 'de' में 'Delegate.CreateDelegate (actionType, ...) में क्या डालूँगा;'? मुझे लगता है कि आपका समाधान मुझे चाहिए, क्योंकि मैं इस प्रतिनिधि को स्रोत असेंबली में किसी भी निर्माता के पास पास कर दूंगा। – dss539

+0

धन्यवाद, मैंने अपने मुद्दों का समाधान किया। आपका सहयोग सराहनीय है। – dss539

3

आप इसे अपने कॉलिंग कोड में Action<Foo.Bar> पर कॉल नहीं कर सकते हैं, क्योंकि यदि आप संकलन समय पर इसका संदर्भ नहीं देते हैं तो आपको उस प्रकार की परिभाषा तक पहुंच नहीं होगी। चूंकि प्रतिनिधि प्रतिनिधि हैं, आप Action<Object> वापस कर सकते हैं और इसका उपयोग कर सकते हैं, या Action<IBar> का उपयोग कर सकते हैं जहां IBar इंटरफ़ेस को संदर्भित असेंबली में परिभाषित किया गया है, और Foo.Bar द्वारा कार्यान्वित किया गया है।

आप एक Action<Object> वापसी करते हैं, तो आप या तो (यदि # 4.0 सी का उपयोग कर या dynamic) प्रतिबिंब के माध्यम से Foo.Bar सदस्यों का उपयोग करें या Foo.Bar जहां कास्टिंग कोड विधानसभा के लिए एक संदर्भ है करने के लिए इसे डाली का उपयोग जहां Foo.Bar परिभाषित किया गया है होगा ।

+0

"आप इसे अपने कॉलिंग कोड में एक्शन पर कॉल नहीं कर सकते" - हाँ मुझे एहसास है। पुन: contravariance - क्षमा करें मैंने .NET 3.5 निर्दिष्ट नहीं किया था। मैं टैग ठीक कर दूंगा। – dss539