क्या इस तथ्य के आधार पर एक कक्षा का एक उदाहरण बनाने का एक तरीका है जो मैं रनटाइम के दौरान कक्षा का नाम जानता हूं। मूल रूप से मैं एक स्ट्रिंग में कक्षा का नाम होगा।
क्या इस तथ्य के आधार पर एक कक्षा का एक उदाहरण बनाने का एक तरीका है जो मैं रनटाइम के दौरान कक्षा का नाम जानता हूं। मूल रूप से मैं एक स्ट्रिंग में कक्षा का नाम होगा।
जवाबों:
Activator.CreateInstance पद्धति पर एक नज़र डालें ।
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
यह बहुत आसान है। मान लें कि आपका क्लासनाम है Car
और नेमस्पेस है Vehicles
, तो उस पैरामीटर को पास करें, Vehicles.Car
जो टाइप का ऑब्जेक्ट देता है Car
। इस तरह आप गतिशील रूप से किसी भी वर्ग का कोई भी उदाहरण बना सकते हैं।
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
यदि आपका पूरी तरह से योग्य नाम (अर्थात, Vehicles.Car
इस मामले में) किसी अन्य विधानसभा में है, तो Type.GetType
यह शून्य होगा। ऐसे मामलों में, आपके पास सभी असेंबली के माध्यम से लूप हैं और पाते हैं Type
। उसके लिए आप नीचे दिए गए कोड का उपयोग कर सकते हैं
public object GetInstance(string strFullyQualifiedName)
{
Type type = Type.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
type = asm.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
}
return null;
}
अब अगर आप एक पैरामीटर बनाने वाले को कॉल करना चाहते हैं तो निम्न कार्य करें
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
के बजाय
Activator.CreateInstance(t);
dynamic
कोड का उपयोग नहीं करते हैं - देखें stackoverflow.com/a/2690661/904521 )
strFullyQualifiedName
के साथ str
, fullyQualifiedName
काम करेगा।
str
का उपयोग चर के लिए नामकरण सम्मेलन के एक भाग के रूप में किया जाता है। कुछ संगठन और परियोजनाएं इसका पालन करने के लिए जोर देते हैं, इसलिए मैंने इसका उपयोग किया। यदि आपने कुछ विशेष ऑर्गनाइज़ेशंस / प्रोजेक्ट्स में काम किया होता, तो आपको यह पता होता। जैसा कि आपने कहा कि इसके बिना str
भी यह काम करेगा :) @MehdiDehagani
मैंने इस विधि का सफलतापूर्वक उपयोग किया है:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
आपको अपने इच्छित ऑब्जेक्ट प्रकार को दिए गए ऑब्जेक्ट को डालना होगा।
संभवतः मेरा प्रश्न अधिक विशिष्ट होना चाहिए था। मैं वास्तव में स्ट्रिंग के लिए एक बेस क्लास जानता हूं, इसलिए इसे इसके द्वारा हल किया गया है:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
Activator.CreateInstance वर्ग में एक ही चीज़ को विभिन्न तरीकों से प्राप्त करने के विभिन्न तरीके हैं। मैं इसे एक वस्तु में डाल सकता था लेकिन उपरोक्त मेरी स्थिति के लिए सबसे अधिक उपयोग है।
मुझे पता है कि मुझे खेल में देर हो गई है ... लेकिन आप जिस समाधान की तलाश कर रहे हैं, वह उपरोक्त संयोजन हो सकता है, और अपनी वस्तुओं को सार्वजनिक रूप से सुलभ पहलुओं को परिभाषित करने के लिए एक इंटरफ़ेस का उपयोग कर सकता है।
फिर, यदि आपकी सभी कक्षाएं जो इस तरह से उत्पन्न होती हैं, उस इंटरफ़ेस को लागू करती हैं, तो आप बस इंटरफ़ेस प्रकार के रूप में डाल सकते हैं और परिणामी वस्तु के साथ काम कर सकते हैं।
समाधान में किसी अन्य परियोजना से एक वर्ग का एक उदाहरण बनाने के लिए, आप किसी भी वर्ग (उदाहरण के लिए BaseEntity) के नाम से संकेतित विधानसभा प्राप्त कर सकते हैं और एक नया उदाहरण बना सकते हैं:
var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
उदाहरण के लिए, यदि आप डेटाबेस फ़ील्ड में विभिन्न प्रकार के मान संग्रहीत करते हैं (स्ट्रिंग के रूप में संग्रहीत) और इसका नाम के साथ एक और फ़ील्ड है (जैसे, स्ट्रिंग, बूल, इंट, MyClass), तो उस फ़ील्ड डेटा से, आप, अनुमान लगा सकते हैं, उपरोक्त कोड का उपयोग करके किसी भी प्रकार का एक वर्ग बनाएं, और इसे पहले क्षेत्र से मान के साथ आबाद करें। यह निश्चित रूप से उस प्रकार पर निर्भर करता है जिसे आप सही प्रकार में तार को पार्स करने के लिए एक विधि का भंडारण कर रहे हैं। मैंने डेटाबेस में उपयोगकर्ता वरीयता सेटिंग्स को संग्रहीत करने के लिए कई बार इसका उपयोग किया है।
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
आप इस तरह से एक कोड क्यों लिखना चाहते हैं? यदि आपके पास एक क्लास 'ReportClass' उपलब्ध है, तो आप इसे सीधे नीचे दिखा सकते हैं।
ReportClass report = new ReportClass();
कोड ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
का उपयोग तब किया जाता है जब आपके पास आवश्यक वर्ग उपलब्ध नहीं होता है, लेकिन आप एक विधि को गतिशील रूप से इंस्टेंट करना और या करना चाहते हैं।
मेरा मतलब है कि यह तब उपयोगी है जब यू असेंबली जानता है लेकिन कोड लिखते समय आपके पास कक्षा ReportClass
उपलब्ध नहीं है।