Type.GetType ("namespace.abClassName") शून्य देता है


216

यह कोड:

Type.GetType("namespace.a.b.ClassName")

लौटता है null

और हम में है:

using namespace.a.b;

अपडेट करें:

प्रकार मौजूद है, यह एक अलग श्रेणी के पुस्तकालय में है, और मुझे इसे स्ट्रिंग नाम से प्राप्त करने की आवश्यकता है।


असेंबली योग्य नाम कैसे प्राप्त करें, इसकी जानकारी के लिए इस stackoverflow.com/questions/441680/… को देखें ।
Polyfun

जवाबों:


244

Type.GetType("namespace.qualified.TypeName") केवल तब काम करता है जब प्रकार mscorlib.dll या वर्तमान में निष्पादित विधानसभा में पाया जाता है।

यदि उन चीजों में से कोई भी सत्य नहीं है, तो आपको विधानसभा-योग्य नाम की आवश्यकता होगी :

Type.GetType("namespace.qualified.TypeName, Assembly.Name")

3
प्रकार मौजूद है, यह एक अलग श्रेणी की लाइब्रेरी में है, और मुझे इसे स्ट्रिंग नाम से प्राप्त करने की आवश्यकता है
ओमू

25
असेंबली-योग्य नाम का उपयोग करने के बजाय आप असेंबली को नाम से लोड कर सकते हैं - Assembly a = Assembly.Load("SomeLibrary");- और फिर असेंबली से नाम से प्रकार लोड करें - Type t = a.GetType("namespace.a.b.ClassName");
केनी एविट

6
शायद आप चाहें तो typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);कुछ परेशानी को बचा सकते हैं, अंततः
Felype

Felype की प्रतिक्रिया केवल एक ही थी जिसे मैं काम कर सकता था।
रुडी स्कोगिंस

Add। TirstOrDefault () @ फालिक कमेंट पर
Leandro

173

आप विधानसभा योग्य नाम के बिना भी प्रकार प्राप्त कर सकते हैं, लेकिन dll नाम भी उदाहरण के लिए:

Type myClassType = Type.GetType("TypeName,DllName");

मेरे पास भी यही स्थिति थी और इसने मेरे लिए काम किया। मुझे "DataModel.QueueObject" प्रकार की एक वस्तु की आवश्यकता थी और "DataModel" का संदर्भ था, इसलिए मुझे निम्न प्रकार मिला:

Type type = Type.GetType("DataModel.QueueObject,DataModel");

अल्पविराम के बाद दूसरा तार संदर्भ नाम (dll नाम) है।


2
क्या यह एक 'ट्रिक' है या एक वास्तविक तरीका है? मुझे यह दस्तावेज -_- में नहीं मिला। वैसे, यह मेरी 1 सप्ताह की पीड़ा को समाप्त करता है! धन्यवाद
DnR

1
यह एक बहुत क्लीनर समाधान है, मुझे यह देखना अच्छा लगेगा कि क्या इस वजह से कोई नुकसान हुआ है।
कोस्कैसमैन

4
इस उत्तर में प्रयुक्त फॉर्म भी MSDN व्याकरण के अनुसार पूरी तरह से योग्य नाम है (इसलिए यह कोई चाल नहीं है )। फॉर्म वह है NamespaceTypeName, AssemblyNameSpecजहां AssemblyNameSpecबिना किसी गुण के विधानसभा का पहचानकर्ता है। भले ही यह उत्तर अनिवार्य रूप से स्वीकार किए गए के समान है, लेकिन मुझे लगता है कि कुछ लोग इसे पसंद करते हैं क्योंकि यह कुछ "शोर" के साथ दूर होता है जो विधानसभा गुणों को पेश करते हैं (जैसे Version, Culture PublicKeyToken)। सौभाग्य से, गुण वैकल्पिक हैं
मार्टिन लेविस

नेस्टेड प्रकारों के लिए, आपको कुछ करने की आवश्यकता हो सकती हैAtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
toddmo

धन्यवाद, यह App_Code फ़ोल्डर के लिए काम करता है। उदाहरण: Type.GetType ("TypeName, App_Code");
बुरक कोरे बालिक

79

इस विधि का उपयोग करके देखें

 public static Type GetType(string typeName)
        {
            var type = Type.GetType(typeName);
            if (type != null) return type;
            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                type = a.GetType(typeName);
                if (type != null)
                    return type;
            }
            return null ;
        }

यह वही है जो वास्तव में मेरे लिए काम करता है। फ़ॉरच लूप से पहले सबरिंग ट्रिम जोड़कर मुझे ट्वीक करना पड़ा, हालाँकि, मैं असेंबली-क्वालिफाइड नाम से गुज़रा, और असेंबली.गेट टाइप () केवल तभी काम करता है जब आप असेंबली की जानकारी को बाहर करते हैं।
कॉलिन

यह बहुत अच्छा लग रहा है, लेकिन अन्य विधानसभा प्रकारों का उपयोग करते हुए जेनरिक के बारे में क्या?
डेमेट्रीस लेप्टोस

UWP के लिए काम नहीं करता क्योंकि AppDomainसमर्थित नहीं है। किसी भी विकल्प के बारे में सुनिश्चित नहीं है।
जेम्स एम

25
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
    lock (typeCache) {
        if (!typeCache.TryGetValue(typeName, out t)) {
            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
                t = a.GetType(typeName);
                if (t != null)
                    break;
            }
            typeCache[typeName] = t; // perhaps null
        }
    }
    return t != null;
}

1
यह बहुत अच्छा लग रहा है, लेकिन अन्य विधानसभा प्रकारों का उपयोग करते हुए जेनरिक के बारे में क्या?
डेमेट्रीस लेप्टोस

1
@DemetrisLeptos (मुझे पता है कि टिप्पणी पुरानी है - लेकिन अन्य लोग अभी भी रुचि ले सकते हैं): int index = typeName.IndexOf ('`') का उपयोग करें; if (इंडेक्स> 0) {typeName = _typeName.Substring (0, इंडेक्स + 2); } ध्यान दें कि Tजेनेरिक प्रकार का छीन लिया गया है।
बर्नहार्ड हिलर

25

यदि असेंबली ASP.NET अनुप्रयोग के निर्माण का हिस्सा है, तो आप BuildManager वर्ग का उपयोग कर सकते हैं:

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);

1
यह एक शानदार उत्तर है और पृष्ठ पर अधिक होना चाहिए। विधानसभा के योग्य प्रकार के नाम प्राप्त करने के पुराने तरीके की तुलना में एक आकर्षण की तरह काम करता है और मृत-सरल है।
ग्राहम

यह आश्चर्यजनक रूप से सरल और हाजिर है, क्या आप प्रतिबिंब वस्तुओं के प्रदर्शन के अनुकूलन में मेरी मदद कर सकते हैं?
आलोक

15

यदि आपकी कक्षा वर्तमान में नहीं है, तो आपको योग्य नाम देना होगा और यह कोड दिखाता है कि कक्षा का योग्य नाम कैसे प्राप्त करें

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

और फिर आप क्लेमनाम के साथ टाइप कर सकते हैं

Type elementType = Type.GetType(qualifiedName);

8

यदि यह एक नेस्टेड प्रकार है, तो आप एक को बदलना भूल सकते हैं। a + को

बावजूद, typeof( T).FullNameआपको बताएगा कि आपको क्या कहना चाहिए

संपादित करें: बीटीडब्लू (जैसा कि मुझे पता है कि आप जानते हैं) संकलन समय पर कंपाइलर के लिए केवल निर्देश हैं और इस प्रकार एपीआई कॉल की सफलता पर कोई प्रभाव नहीं पड़ सकता है। (यदि आपके पास प्रोजेक्ट या असेंबली रेफरेंस होते हैं, तो इसका संभावित रूप से प्रभाव हो सकता है - इसलिए जानकारी बेकार नहीं है, यह सिर्फ कुछ फ़िल्टरिंग लेता है ...)


अरे बाप रे! क्या आप जानते हैं कि यह "+" - वाक्यविन्यास कहाँ समझाया गया है?
रक्षा एक

1
Protectorone I ने इसे amazon.com/Essential-NET-Common-Language-Runtime/dp/0201734117 IIRC से सीखा , लेकिन यह थोड़ा सा दिनांक है। क्या मैं amazon.com/CLR-via-4th-Developer-Reference/dp/0735667454/… को सभी .NET devs के लिए एक गैर-उपयोगी पुस्तक के रूप में सुझा सकता / सकती हूं ? लब्बोलुआब यह है कि प्रकारों के लिए, सीएलआर में केवल नाम स्थान और नाम है - एक नेस्टेड प्रकार सीधे पता नहीं है। इसलिए, एक भाषा, अगर इसमें एक नेस्टेड प्रकार की अवधारणा होती है, तो उसे वह करने की आवश्यकता होती है (हालांकि सामान्य रूप से अधिकांश लंग्स एक +विभाजक का उपयोग करते हैं )
रुबेन बार्टेलिंक

6

मैं उपयोगकर्ता नियंत्रणों को खोल रहा हूं जो इस बात पर निर्भर करता है कि उपयोगकर्ता किसी डेटाबेस में निर्दिष्ट उपयोगकर्ता की पहुंच को नियंत्रित करता है। इसलिए मैंने TypeName प्राप्त करने के लिए इस विधि का उपयोग किया ...

Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))

तो अब उस वस्तु का एक उदाहरण बनाने के लिए strType में दिए गए मान का उपयोग कर सकते हैं।


एक महाकाव्य-पुराने विषय को फिर से खोलना ... बधाई। हालाँकि मुझे आपके उत्तर को अस्वीकार करना होगा क्योंकि टीओई वास्तव में टाइपरनाम को जानता है और इससे टाइप प्राप्त करना चाहता है। Btw .: आप किस विधि का संदर्भ लेते हैं <c> GetType (Namespace.ClassName) </ c>, अगर इसका Type.GetType it´ll केवल उन प्रकारों पर काम करता है जो आपके वर्तमान निष्पादन असेंबली या msllib में हैं, लेकिन जैसा कि कोई भी नहीं करता है इन शर्तों पर लागू होता है।
HimBromBeere

2
@HimBromBeere नीचे वोट के लिए धन्यवाद। यह आप जैसे लोग हैं जो मेरे निष्कर्षों को पोस्ट करने के लिए मुझे डिमोनेटाइज़ करते हैं। मैं अभी भी विकास सीख रहा हूं और मैं सिर्फ दूसरों की मदद करने की कोशिश कर रहा हूं। और अब आप मुझसे अपने प्रश्न का उत्तर देने की अपेक्षा करते हैं? वैसे, मैंने सवाल का सही जवाब दिया है। जो वर्ग मैं एक अलग परियोजना में रहता है उसका उदाहरण बना रहा था और उसी के कारण असेंबली क्विकलाइज्ड नाम का उपयोग करना पड़ा। तो कृपया नीचे टिप्पणी करने से पहले बाकी टिप्पणियों को पढ़ें। "प्रकार मौजूद है, यह एक अलग श्रेणी के पुस्तकालय में है, और मुझे इसे स्ट्रिंग नाम से प्राप्त करने की आवश्यकता है - ओमू"
स्टीफन

6

जब मेरे पास केवल कक्षा का नाम होता है तो मैं इसका उपयोग करता हूं:

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();

5

जैसा कि Type.GetType (String) को Type.AssemblyQualifiedName की आवश्यकता होती है, आपको असेंबली का उपयोग करना चाहिए । CreateQualifiedName (स्ट्रिंग, स्ट्रिंग)

string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);

संस्करण, संस्कृति और PublicKeyToken की आवश्यकता नहीं है, assemblyNameइसीलिए आप MyAssembly.Getame () नाम का उपयोग कर सकते हैं।

Type.GetType (स्ट्रिंग) के बारे में :

यदि प्रकार वर्तमान में एग्जीक्यूटिव असेंबली में या Mscorlib.dll में है, तो यह अपने नामस्थान द्वारा योग्य टाइप नाम की आपूर्ति करने के लिए पर्याप्त है।


4

यदि विधानसभा संदर्भित है और कक्षा दृश्यमान है:

typeof(namespace.a.b.ClassName)

GetType रिटर्न शून्य है क्योंकि टाइपो नहीं मिला है, टाइपोफ़ के साथ, कंपाइलर आपको त्रुटि का पता लगाने में मदद कर सकता है।


प्रकार मौजूद है, यह एक अलग वर्ग के पुस्तकालय में है, और मुझे इसे स्ट्रिंग नाम से प्राप्त करने की आवश्यकता है
ओमू

4

पूर्ण प्रकार के नाम का उपयोग करने का प्रयास करें जिसमें विधानसभा जानकारी शामिल है, उदाहरण के लिए:

string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);

मेरे पास एक ही स्थिति थी जब मैं एक अलग विधानसभा में कक्षा के प्रकार को प्राप्त करने के लिए केवल namesspace.classname का उपयोग कर रहा था और यह काम नहीं करेगा। केवल तभी काम किया गया जब मैंने अपने टाइप स्ट्रिंग में असेंबली जानकारी शामिल की जैसा कि ऊपर दिखाया गया है।


3

सुनिश्चित करें कि अल्पविराम पूरी तरह से योग्य नाम के बाद है

typeof(namespace.a.b.ClassName, AssemblyName)

इस अभ्यस्त काम के रूप में

typeof(namespace.a.b.ClassName ,AssemblyName)

मुझे इस पर कुछ दिनों के लिए रोक दिया गया था


2

मेरे लिए, एक "+" कुंजी थी! यह मेरी कक्षा है (यह एक नेस्टेड है):

namespace PortalServices
{
public class PortalManagement : WebService
{
    public class Merchant
    {}
}
}

और कोड की इस लाइन ने काम किया:

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");

1

ऊपर दिया गया यह समाधान मुझे सबसे अच्छा लगता है, लेकिन यह मेरे लिए काम नहीं करता है, इसलिए मैंने इसे निम्नानुसार किया:

AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);

Type myType = Type.GetType(typeAssemblyQualifiedName);

पूर्व शर्त यह है कि आप विधानसभा का मार्ग जानते हैं। मेरे मामले में मैं इसे जानता हूं क्योंकि यह एक अन्य आंतरिक परियोजना से निर्मित एक विधानसभा है और इसे हमारी परियोजना के बिन फ़ोल्डर में शामिल किया गया है।

यदि मैं दृश्य स्टूडियो 2013 का उपयोग कर रहा हूं तो यह मायने रखता है, मेरा लक्ष्य .NET 4.0 है। यह एक ASP.NET प्रोजेक्ट है, इसलिए मुझे इसके माध्यम से निरपेक्ष मार्ग मिल रहा है HttpContext। हालाँकि, असेंबली पथ एक आवश्यकता नहीं है क्योंकि यह MSDN से असेंबलीक्यूलाइज्ड नाम पर लगता है


0

मुझे धोखा दिया। चूँकि मैं (नाम से) जो प्रकार बनाना चाहते हैं, वे सभी एक dll I नियंत्रण में हैं, मैंने बस असेंबली में dll में एक स्थैतिक विधि लगाई है जो एक साधारण नाम लेता है, और उस संदर्भ से type.GetType को कॉल करता है और परिणाम लौटाता है ।

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


नमस्ते, मैंने गलती से हार मान ली है, कृपया अपना उत्तर संपादित करें ताकि मैं इसे पूर्ववत कर सकूं।
कोलबोक्सप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.