के माध्यम से प्रतिनिधि बनाएं एक विधानसभा किप्रतिबिंब
namespace Foo{public class Bar;}
शामिल मैं संकलन समय पर पहले विधानसभा के संदर्भ के बिना एक और विधानसभा से एक Action<Foo.Bar>
बना सकते हैं कैसे देखते हुए?
के माध्यम से प्रतिनिधि बनाएं एक विधानसभा किप्रतिबिंब
namespace Foo{public class Bar;}
शामिल मैं संकलन समय पर पहले विधानसभा के संदर्भ के बिना एक और विधानसभा से एक Action<Foo.Bar>
बना सकते हैं कैसे देखते हुए?
तो आप का उपयोग
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);
कुछ मुझसे कहता है कि क्या आप की सोच रहे हैं नहीं है ...
आप इसे अपने कॉलिंग कोड में Action<Foo.Bar>
पर कॉल नहीं कर सकते हैं, क्योंकि यदि आप संकलन समय पर इसका संदर्भ नहीं देते हैं तो आपको उस प्रकार की परिभाषा तक पहुंच नहीं होगी। चूंकि प्रतिनिधि प्रतिनिधि हैं, आप Action<Object>
वापस कर सकते हैं और इसका उपयोग कर सकते हैं, या Action<IBar>
का उपयोग कर सकते हैं जहां IBar
इंटरफ़ेस को संदर्भित असेंबली में परिभाषित किया गया है, और Foo.Bar
द्वारा कार्यान्वित किया गया है।
आप एक Action<Object>
वापसी करते हैं, तो आप या तो (यदि # 4.0 सी का उपयोग कर या dynamic
) प्रतिबिंब के माध्यम से Foo.Bar
सदस्यों का उपयोग करें या Foo.Bar
जहां कास्टिंग कोड विधानसभा के लिए एक संदर्भ है करने के लिए इसे डाली का उपयोग जहां Foo.Bar
परिभाषित किया गया है होगा ।
"आप इसे अपने कॉलिंग कोड में एक्शन
क्या आप "पहले विधानसभा के संदर्भ के बिना" द्वारा मतलब है? यदि आप उस असेंबली से किसी प्रकार का उपयोग करना चाहते हैं तो आपको इसे किसी भी तरह से संदर्भित करना होगा। – LukeH
क्षमा करें, मेरा मतलब है कि इसे विजुअल स्टूडियो प्रोजेक्ट के संदर्भ के रूप में जोड़ना। यानी इसे लोड करने के लिए Assembly.LoadFrom() का उपयोग करें ताकि कोई संकलन-समय निर्भरता न हो। – dss539
@LukeH - थोड़ा सा स्पष्ट होने के लिए संपादित प्रश्न। इनपुट के लिए धन्यवाद। – dss539