हां, आप यह कर सकते हैं और यह अच्छी तरह से काम करता है। हालांकि, गतिशील कीवर्ड का उपयोग करते समय अधिक सुविधाजनक है, यह देर से बाध्यकारी का उपयोग करता है और अभी भी उतना ही असुरक्षित है, उस अर्थ में, स्पष्ट रूप से प्रतिबिंब का उपयोग करते हुए। यदि आपका डिज़ाइन इसकी अनुमति देता है, तो प्रारंभिक बाध्यकारी के लिए साझा इंटरफ़ेस या बेस क्लास का उपयोग करना बेहतर होता है। आप अपनी असेंबली में या तीसरे, साझा असेंबली में सार्वजनिक प्रकार बनाकर ऐसा कर सकते हैं और फिर उस असेंबली का संदर्भ उस नए से जोड़ सकते हैं जिसे आप गतिशील रूप से संकलित कर रहे हैं। फिर, जेनरेट कोड में, आप संदर्भित असेंबली में उस साझा प्रकार से प्राप्त कर सकते हैं।
public interface IFoo
{
string Execute();
}
तब गतिशील रूप से इस तरह विधानसभा संकलन: उदाहरण के लिए, एक अंतरफलक बनाने
using (Microsoft.CSharp.CSharpCodeProvider foo = new Microsoft.CSharp.CSharpCodeProvider())
{
var params = new System.CodeDom.Compiler.CompilerParameters();
params.GenerateInMemory = true;
// Add the reference to the current assembly which defines IFoo
params.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);
// Implement the IFoo interface in the dynamic code
var res = foo.CompileAssemblyFromSource(params, "public class FooClass : IFoo { public string Execute() { return \"output!\";}}");
var type = res.CompiledAssembly.GetType("FooClass");
// Cast the created object to IFoo
IFoo obj = (IFoo)Activator.CreateInstance(type);
// Use the object through the IFoo interface
obj.Execute();
}
कितना नियंत्रण गतिशील कोड पर है के आधार पर, इस या संभव नहीं हो सकता सकता है, लेकिन जब ऐसा होता है, तो संकलन-समय टाइप-जांच करना अच्छा होता है। उदाहरण के लिए, अमल करने के लिए आप की कोशिश की है, तो: दूसरी पंक्ति तुरंत जबकि डायनामिक कीवर्ड या प्रतिबिंब के साथ, उस रेखा को सफलतापूर्वक संकलन होता है, संकलित करने के लिए विफल हो जाएगा
IFoo obj = (IFoo)Activator.CreateInstance(type);
obj.Execcute();
ऐसा इसलिए है क्योंकि यह गलत वर्तनी लेकिन यह एक रन-टाइम का कारण होगा अपवाद। उदाहरण के लिए, निम्नलिखित संकलन-समय त्रुटि नहीं मिलेगी:
dynamic obj = Activator.CreateDynamicInstance(type);
obj.Execcute();
स्रोत
2012-06-06 13:26:24
हां, थोड़ा कम कोड है। इसके बजाय 'Activator.CreateInstance()' का उपयोग करके इसे काम करें। मुझे अन्यथा कोई सवाल नहीं दिख रहा है। –
हां मैंने अभी कोशिश की और महसूस किया कि यह 'var' के बजाय' गतिशील 'के साथ "बस काम करता है"। बहुत अच्छी चीजें। –