यह कोड:
Type.GetType("namespace.a.b.ClassName")
लौटता है null
।
और हम में है:
using namespace.a.b;
अपडेट करें:
प्रकार मौजूद है, यह एक अलग श्रेणी के पुस्तकालय में है, और मुझे इसे स्ट्रिंग नाम से प्राप्त करने की आवश्यकता है।
यह कोड:
Type.GetType("namespace.a.b.ClassName")
लौटता है null
।
और हम में है:
using namespace.a.b;
अपडेट करें:
प्रकार मौजूद है, यह एक अलग श्रेणी के पुस्तकालय में है, और मुझे इसे स्ट्रिंग नाम से प्राप्त करने की आवश्यकता है।
जवाबों:
Type.GetType("namespace.qualified.TypeName")
केवल तब काम करता है जब प्रकार mscorlib.dll या वर्तमान में निष्पादित विधानसभा में पाया जाता है।
यदि उन चीजों में से कोई भी सत्य नहीं है, तो आपको विधानसभा-योग्य नाम की आवश्यकता होगी :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
- और फिर असेंबली से नाम से प्रकार लोड करें - Type t = a.GetType("namespace.a.b.ClassName");
।
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
कुछ परेशानी को बचा सकते हैं, अंततः
आप विधानसभा योग्य नाम के बिना भी प्रकार प्राप्त कर सकते हैं, लेकिन dll नाम भी उदाहरण के लिए:
Type myClassType = Type.GetType("TypeName,DllName");
मेरे पास भी यही स्थिति थी और इसने मेरे लिए काम किया। मुझे "DataModel.QueueObject" प्रकार की एक वस्तु की आवश्यकता थी और "DataModel" का संदर्भ था, इसलिए मुझे निम्न प्रकार मिला:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
अल्पविराम के बाद दूसरा तार संदर्भ नाम (dll नाम) है।
NamespaceTypeName, AssemblyNameSpec
जहां AssemblyNameSpec
बिना किसी गुण के विधानसभा का पहचानकर्ता है। भले ही यह उत्तर अनिवार्य रूप से स्वीकार किए गए के समान है, लेकिन मुझे लगता है कि कुछ लोग इसे पसंद करते हैं क्योंकि यह कुछ "शोर" के साथ दूर होता है जो विधानसभा गुणों को पेश करते हैं (जैसे Version
, Culture
PublicKeyToken
)। सौभाग्य से, गुण वैकल्पिक हैं ।
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
इस विधि का उपयोग करके देखें
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 ;
}
AppDomain
समर्थित नहीं है। किसी भी विकल्प के बारे में सुनिश्चित नहीं है।
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;
}
T
जेनेरिक प्रकार का छीन लिया गया है।
यदि असेंबली ASP.NET अनुप्रयोग के निर्माण का हिस्सा है, तो आप BuildManager वर्ग का उपयोग कर सकते हैं:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
यदि आपकी कक्षा वर्तमान में नहीं है, तो आपको योग्य नाम देना होगा और यह कोड दिखाता है कि कक्षा का योग्य नाम कैसे प्राप्त करें
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
और फिर आप क्लेमनाम के साथ टाइप कर सकते हैं
Type elementType = Type.GetType(qualifiedName);
यदि यह एक नेस्टेड प्रकार है, तो आप एक को बदलना भूल सकते हैं। a + को
बावजूद, typeof( T).FullName
आपको बताएगा कि आपको क्या कहना चाहिए
संपादित करें: बीटीडब्लू (जैसा कि मुझे पता है कि आप जानते हैं) संकलन समय पर कंपाइलर के लिए केवल निर्देश हैं और इस प्रकार एपीआई कॉल की सफलता पर कोई प्रभाव नहीं पड़ सकता है। (यदि आपके पास प्रोजेक्ट या असेंबली रेफरेंस होते हैं, तो इसका संभावित रूप से प्रभाव हो सकता है - इसलिए जानकारी बेकार नहीं है, यह सिर्फ कुछ फ़िल्टरिंग लेता है ...)
+
विभाजक का उपयोग करते हैं )
मैं उपयोगकर्ता नियंत्रणों को खोल रहा हूं जो इस बात पर निर्भर करता है कि उपयोगकर्ता किसी डेटाबेस में निर्दिष्ट उपयोगकर्ता की पहुंच को नियंत्रित करता है। इसलिए मैंने TypeName प्राप्त करने के लिए इस विधि का उपयोग किया ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
तो अब उस वस्तु का एक उदाहरण बनाने के लिए strType में दिए गए मान का उपयोग कर सकते हैं।
जैसा कि 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 में है, तो यह अपने नामस्थान द्वारा योग्य टाइप नाम की आपूर्ति करने के लिए पर्याप्त है।
यदि विधानसभा संदर्भित है और कक्षा दृश्यमान है:
typeof(namespace.a.b.ClassName)
GetType रिटर्न शून्य है क्योंकि टाइपो नहीं मिला है, टाइपोफ़ के साथ, कंपाइलर आपको त्रुटि का पता लगाने में मदद कर सकता है।
पूर्ण प्रकार के नाम का उपयोग करने का प्रयास करें जिसमें विधानसभा जानकारी शामिल है, उदाहरण के लिए:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
मेरे पास एक ही स्थिति थी जब मैं एक अलग विधानसभा में कक्षा के प्रकार को प्राप्त करने के लिए केवल namesspace.classname का उपयोग कर रहा था और यह काम नहीं करेगा। केवल तभी काम किया गया जब मैंने अपने टाइप स्ट्रिंग में असेंबली जानकारी शामिल की जैसा कि ऊपर दिखाया गया है।
मेरे लिए, एक "+" कुंजी थी! यह मेरी कक्षा है (यह एक नेस्टेड है):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
और कोड की इस लाइन ने काम किया:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
ऊपर दिया गया यह समाधान मुझे सबसे अच्छा लगता है, लेकिन यह मेरे लिए काम नहीं करता है, इसलिए मैंने इसे निम्नानुसार किया:
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 से असेंबलीक्यूलाइज्ड नाम पर लगता है
मुझे धोखा दिया। चूँकि मैं (नाम से) जो प्रकार बनाना चाहते हैं, वे सभी एक dll I नियंत्रण में हैं, मैंने बस असेंबली में dll में एक स्थैतिक विधि लगाई है जो एक साधारण नाम लेता है, और उस संदर्भ से type.GetType को कॉल करता है और परिणाम लौटाता है ।
मूल उद्देश्य इतना था कि कॉन्फ़िगरेशन डेटा में नाम द्वारा प्रकार निर्दिष्ट किया जा सकता है। मैंने तब से कोड को बदल दिया है ताकि उपयोगकर्ता को संसाधित करने के लिए एक प्रारूप निर्दिष्ट हो। प्रारूप हैंडलर कक्षाएं एक इंटरफ़ेस को लागू करती हैं जो निर्धारित करती है कि क्या प्रकार निर्दिष्ट प्रारूप को पार्स कर सकता है। फिर मैं इंटरफ़ेस को लागू करने वाले प्रकारों को खोजने के लिए प्रतिबिंब का उपयोग करता हूं, और एक को ढूंढता हूं जो प्रारूप को संभालता है। तो अब विन्यास एक प्रारूप नाम निर्दिष्ट करता है, एक विशिष्ट प्रकार नहीं। परावर्तन कोड आसन्न dlls और भार को देख सकता है, इसलिए मेरे पास एक प्रकार का गरीब आदमी का प्लग-इन आर्किटेक्चर है।