स्ट्रिंग


168

से किसी वर्ग का एक उदाहरण बनाएं इस तथ्य के आधार पर कक्षा का एक उदाहरण बनाने का कोई तरीका है जिसे मैं रनटाइम पर कक्षा का नाम जानता हूं। असल में मेरे पास एक स्ट्रिंग में कक्षा का नाम होगा।

137

Activator.CreateInstance विधि पर एक नजर डालें।

+14

महान उदाहरण के साथ संबंधित करना चाहते हैं अब नीचे कोड</p> <pre><code>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; } </code></pre> <p>उपयोग कर सकते हैं : //stackoverflow.com/questions/493490/converting-a-string-to-a-class-name 24 apr. 132013-04-24 14:23:37

  0

यह पोस्ट भी प्रासंगिक होगा, क्योंकि आपके प्रकार को ढूंढने की आवश्यकता है: http: // st ackoverflow.com/questions/1825147/type-gettypenamespace-ab-classname-returns-null 23 aug. 132013-08-23 20:48:13

+4

उदाहरण के लिए: ' var driver = (OpenQA.Selenium.IWebDriver) एक्टिवेटर। क्रिएटइंस्टेंस ("वेबड्राइवर", "ओपनक्यूए। सेलेनियम। फेयरफ़ॉक्स.फिरफ़ॉक्स ड्रायवर")। अनवर्रप(); ' 04 oct. 142014-10-04 04:37:07

+2

यहां महत्वपूर्ण नोट: .Unwrap() को रिमोटिंग हैंडल से पहले प्राप्त करने के लिए आप वास्तव में कास्ट कर सकते हैं। @ एन्डी - धन्यवाद 20 jul. 152015-07-20 01:31:38


49

मैं इस विधि सफलतापूर्वक उपयोग किया है:

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className) 

आप अपने वांछित ऑब्जेक्ट प्रकार के लिए लौट आए वस्तु कास्ट करने के लिए की आवश्यकता होगी।

  0

एचएम .. उपयोगकर्ता नाम बदल जाता है अद्वितीय नहीं है। 21 oct. 082008-10-21 23:48:02

+7

मैं एक परिदृश्य की कल्पना करने की कोशिश कर रहा हूं जहां कक्षा के नाम के माध्यम से ऑब्जेक्ट बनाना और उसके बाद इसे कास्ट करना किसी भी प्रकार का अर्थ होगा। 21 oct. 082008-10-21 23:53:35

+11

मैं देखता हूं कि आपका क्या मतलब है। यह अनावश्यक लगता है। यदि आप कक्षा का नाम जानते हैं, तो आपको गतिशील स्ट्रिंग की आवश्यकता क्यों है? एक स्थिति यह हो सकती है कि बेस क्लास में आपकी कास्टिंग और स्ट्रिंग उस बेस क्लास के वंशजों का प्रतिनिधित्व करे। 21 oct. 082008-10-21 23:58:29

+3

यदि बेस क्लास ज्ञात है, तो आप बेस क्लास या इसके इंटरफ़ेस का उपयोग बिना प्रतिबिंब के वंशजों को पारित करने के तर्क के रूप में कर सकते हैं। 25 jan. 142014-01-25 09:01:11

+2

उपयोगी परिदृश्य: आपको केवल सीरियलाइजेशन इंटरफेस, या किसी अन्य सामान्य इंटरफेस की आवश्यकता है। आप इसे कक्षा में नहीं डालेंगे, लेकिन कम से कम किसी ऑब्जेक्ट से अधिक कुछ 08 dec. 142014-12-08 11:08:49

  0

Xaml एक नए नेविगेशन पेज पर क्लिक करने का एक आदर्श उदाहरण है, मैं कई और सोच सकता हूं। 05 jan. 162016-01-05 19:03:08

+1

दिए गए स्ट्रिंग__ से __ से कास्ट कैसे करें ?? 25 apr. 162016-04-25 12:00:04


16

शायद मेरा प्रश्न अधिक विशिष्ट होना चाहिए था। मैं वास्तव में पता स्ट्रिंग के लिए एक आधार वर्ग तो द्वारा इसे हल:

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); 

Activator.CreateInstance वर्ग अलग अलग तरीकों से एक ही बात को प्राप्त करने के विभिन्न तरीकों है। मैं इसे किसी ऑब्जेक्ट पर डाल सकता था लेकिन उपरोक्त मेरी स्थिति के लिए सबसे अधिक उपयोग है।

+2

प्रश्न अनुभाग में जवाब देने के बजाय, मैं सुझाव दूंगा कि आप अपना प्रश्न संपादित करें और परिवर्तनों को नोट करें। इसे करने के लिए आपको अधिक/बेहतर उत्तर मिलेंगे। 22 oct. 082008-10-22 00:53:45

  0

आपके लिए काम किए गए कोड की विशिष्ट पंक्ति पोस्ट करने के लिए धन्यवाद। सभी CreateInstance ओवरलोड और प्रकार उत्पन्न करने के विभिन्न तरीकों के माध्यम से छंटनी मुझे बहुत समय ले रही थी, जिसे आपने मुझे बचाया था। 05 jan. 112011-01-05 22:01:12


3

आप समाधान आप लागू करना चाहते हैं, लेकिन नहीं समस्या को हल करने की कोशिश कर रहे वर्णन किया है लगता है।

शायद आप तानाना के साथ कुछ, जिस स्थिति में मैं तुम्हें Managed Extensibility Framework की जाँच का सुझाव करने के लिए कोशिश कर रहे हैं।


-8
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); 

आप इस तरह के कोड क्यों लिखना चाहते हैं? यदि आपके पास कक्षा 'रिपोर्ट क्लास' उपलब्ध है, तो आप नीचे दिखाए गए अनुसार इसे तुरंत चालू कर सकते हैं।

ReportClass report = new ReportClass(); 

कोड ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); प्रयोग किया जाता है जब आप न आवश्यक वर्ग उपलब्ध है, लेकिन आप का दृष्टांत करना चाहते हैं और या या गतिशील रूप से एक विधि आह्वान।

मेरा मतलब यह उपयोगी होता है जब यू विधानसभा जानते हैं, लेकिन आप न वर्ग ReportClass उपलब्ध है, जबकि कोड लिखने।


1

उदाहरण के लिए, यदि आप डेटाबेस फ़ील्ड (स्ट्रिंग के रूप में संग्रहीत) में विभिन्न प्रकार के मान संग्रहीत करते हैं और टाइप फ़ील्ड (यानी, स्ट्रिंग, बूल, int, MyClass) के साथ एक और फ़ील्ड रखते हैं, तो उस फ़ील्ड डेटा से, आप अनुमानित रूप से, उपरोक्त कोड का उपयोग कर किसी भी प्रकार की कक्षा बना सकते हैं, और इसे पहले फ़ील्ड से मूल्य के साथ पॉप्युलेट कर सकते हैं। यह निश्चित रूप से उस प्रकार पर निर्भर करता है जिस पर आप स्ट्रिंग को सही प्रकार में पार्स करने के लिए एक विधि रखते हैं। मैंने डेटाबेस में उपयोगकर्ता वरीयता सेटिंग्स को स्टोर करने के लिए कई बार इसका उपयोग किया है।


4

मैं जानता हूँ कि मैं खेल के लिए देर हो रही है ... लेकिन समाधान आप देख रहे हैं इसके बाद के संस्करण के संयोजन हो सकता है, और सार्वजनिक रूप से सुलभ पहलुओं अपने वस्तुओं को परिभाषित करने के लिए एक इंटरफेस का उपयोग कर।

फिर, अपनी कक्षाओं कि इस तरह से है कि इंटरफ़ेस को लागू उत्पन्न होगा के सभी करता है, तो आप सिर्फ इंटरफ़ेस प्रकार के रूप में कास्ट और जिसके परिणामस्वरूप वस्तु के साथ काम कर सकते हैं।


37

यह बहुत आसान है। मान लें कि आपका वर्गनाम Car है और नामस्थान Vehicles है, तो पैरामीटर को Vehicles.Car के रूप में पास करें जो Car प्रकार का ऑब्जेक्ट देता है। इस तरह आप गतिशील रूप से किसी भी वर्ग का कोई उदाहरण बना सकते हैं।

public object GetInstance(string strFullyQualifiedName) 
{   
    Type t = Type.GetType(strFullyQualifiedName); 
    return Activator.CreateInstance(t);   
} 

यदि आपका Fully Qualified Name (यानी, इस मामले में Vehicles.Car) एक और विधानसभा में है, Type.GetType अशक्त हो जाएगा। ऐसे मामलों में, आपके पास सभी असेंबली के माध्यम से लूप है और Type खोजें। http: कि के लिए आप अगर आप एक पैरामिट्रीकृत निर्माता कॉल करने के लिए की बजाय निम्नलिखित

Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type 

Activator.CreateInstance(t); 
  0

कास्टिंग किए बिना इसका उपयोग कैसे करें और दिए गए स्ट्रिंग__ से __ को कैसे करें ?? 25 apr. 162016-04-25 12:16:06

  0

@ टावा - कक्षा के उदाहरण का उपयोग करने के लिए आपको कुछ जानकारी होगी कि यह क्या करने जा रहा है - अन्यथा आप इसका उपयोग नहीं कर पाएंगे। इसके लिए सबसे आम उपयोग केस कुछ इंटरफ़ेस को कास्टिंग करेगा जो आपको एक पूर्वनिर्धारित अनुबंध प्रदान करता है। (यह तब तक रहता है जब तक आप 'गतिशील' कोड का उपयोग नहीं कर रहे हों - http://stackoverflow.com/a/2690661/904521 देखें) 25 may. 162016-05-25 08:47:28