को कास्ट करने के लिए भूल गया था। तो मैंने सोचा कि मैं जो काम करता हूं उसे पोस्ट करूंगा।
सबसे पहले, Activator.CreateInstance
विधि में कई अधिभार हैं। यदि आप केवल Activator.CreateInstance(Type.GetType("MyObj"))
पर कॉल करते हैं, तो यह मानता है कि ऑब्जेक्ट वर्तमान असेंबली में परिभाषित किया गया है, और यह MyObj
देता है।
यदि आप इसे यहां उत्तर में अनुशंसित के रूप में कॉल करते हैं: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, तो इसके बजाय यह ObjectHandle
देता है, और आपको अपनी ऑब्जेक्ट प्राप्त करने के लिए Unwrap()
पर कॉल करने की आवश्यकता है। यह ओवरलोड एक अलग असेंबली (बीटीडब्ल्यू) में परिभाषित विधि को कॉल करने का प्रयास करते समय उपयोगी होता है, आप वर्तमान असेंबली में इस अधिभार का उपयोग कर सकते हैं, बस AssemblyName
पैरामीटर नल छोड़ दें)।
अब, मैंने पाया है कि typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
का उपयोग करने के लिए ऊपर दिए गए सुझाव AssemblyName
के लिए वास्तव में मुझे त्रुटियां मिलीं, और मैं इसे काम नहीं कर सका। मुझे System.IO.FileLoadException
मिल जाएगा (फ़ाइल या असेंबली लोड नहीं हो सका ...)।
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
स्रोत
2017-04-02 22:58:20
तुम क्यों एक स्ट्रिंग के साथ अपने वर्ग instanciate करने की आवश्यकता है:
मैं काम करने के लिए क्या मिला इस प्रकार है? आपके मामले के आधार पर, "क्लीनर" समाधान हो सकते हैं, खासकर यदि आप प्रतिबिंब का उपयोग करने में अनिच्छुक नहीं हैं। –
@SylvestreEquy लेकिन शायद किसी के एल्स मामलों में, यह सिर्फ समाधान है ... SO पर प्रश्न न केवल उनसे पूछते हैं जो उनसे पूछते हैं। –