2008-10-07 13 views
31

मैं System.Type प्राप्त करना चाहता हूं, केवल string में टाइप नाम दिया गया है।सिस्टम प्राप्त करना। टाइप के आंशिक नाम से टाइप करें

उदाहरण के लिए

, अगर मैं एक वस्तु है:

MyClass abc = new MyClass(); 

मैं तो कह सकते हैं:

System.Type type = abc.GetType(); 

लेकिन क्या होगा अगर सब मैं है:

string className = "MyClass"; 
+0

संभावित डुप्लिकेट [टाइप.गेट टाइप() में नामस्थान नाम देने से बचें (http: // stackoverflow .com/प्रश्न/9273629/टालने-देने-नामस्थान-नाम-इन-टाइप-गेटटाइप) – Fr33dan

+0

@ Fr33dan, परिपत्र लूप? उल्लेख किया गया संभावित [मूल] (http://stackoverflow.com/questions/9273629/avoid-giving-namespace-name-in-type-gettype) उल्लेख करता है [यह प्रश्न] (http://stackoverflow.com/questions/179102/हो रही-ए-सिस्टम-प्रकार-से-प्रकार-आंशिक-नाम) यथासंभव मूल (देखें [टिप्पणी] (http://stackoverflow.com/questions/9273629/avoid-giving-namespace-name-in-type- GetType # comment39575691_9273629))? :) – publicgk

+0

@publicgk मैं वास्तव में उस प्रश्न के साथ विलय के लिए इसे ध्वजांकित करने की कोशिश कर रहा था क्योंकि वे वही हैं लेकिन उस प्रश्न और दोनों के पास अच्छे उत्तर हैं। [यह मेटा प्रश्न] देखें (http://meta.stackoverflow.com/q/269080/1111886)। मैंने इसे गलत तरीके से गलत कर दिया और छोड़ दिया, तो कोई बाद में आया और फैसला किया कि यह डुप्लिकेट था क्योंकि दूसरा पुराना सवाल था। – Fr33dan

उत्तर

33
Type type = Type.GetType("foo.bar.MyClass, foo.bar"); 

MSDN। सुनिश्चित करें कि नाम Assembly Qualified है।

+1

एक महत्वपूर्ण नोट: इसे पूरी तरह से योग्य प्रकार के नाम की आवश्यकता है। – leppie

2
Type type = Type.GetType("MyClass"); 

नामस्थान शामिल करना सुनिश्चित करें। उस विधि के ओवरलोड हैं जो केस-सेंसिटीविटी को नियंत्रित करते हैं और यदि टाइप नाम नहीं मिलता है तो अपवाद फेंक दिया जाता है या नहीं।

+1

गलत, आपको असेंबली भी निर्दिष्ट करनी होगी। –

+2

यह काम नहीं करेगा :) – leppie

+1

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

2

अपने वर्ग का एक उदाहरण बनाने के लिए आप प्रकार प्राप्त करने के बाद, और आह्वान एक विधि -

Type type = Type.GetType("foo.bar.MyClass, foo.bar"); 
object instanceObject = System.Reflection.Activator.CreateInstance(type); 
type.InvokeMember(method, BindingFlags.InvokeMethod, null, instanceObject, new object[0]); 
0

Type.GetType(...) कभी कभी असफल हो सकता है typeof ऑपरेटर नहीं किया जा सकता है।

इसके बजाय आप इसे करने के लिए वर्तमान डोमेन से असेंबली पर प्रतिबिंबित कर सकते हैं।

this thread

1

पर मेरी प्रतिक्रिया एक और तरीका है assebly वर्तमान या किसी अन्य प्रकार प्राप्त करने के लिए जाँच करें।

(मानता है कि वर्ग नाम स्थान अपने विधानसभा शामिल हैं):

// Creates and initializes a new object from its name and parameters 
    public Object CreateObjectByName(string name, params Object[] args) 
    { 
     string s = "<prefix>" + name; // case sensitive; Type.FullName 
     Type type = Type.GetType(s); 
     Object o = System.Activator.CreateInstance(type, args); 
     return o; 
    } 

:


public static Type GetType(string fullName) 
{ 
    if (string.IsNullOrEmpty(fullName)) 
     return null; 
    Type type = Type.GetType(fullName); 
    if (type == null) 
    { 
     string targetAssembly = fullName; 
     while (type == null && targetAssembly.Length > 0) 
     { 
      try 
      { 
       int dotInd = targetAssembly.LastIndexOf('.'); 
       targetAssembly = dotInd >= 0 ? targetAssembly.Substring(0, dotInd) : ""; 
       if (targetAssembly.Length > 0) 
        type = Type.GetType(fullName + ", " + targetAssembly); 
      } 
      catch { } 
     } 
    } 
    return type; 
} 
0

यहाँ बनाने और उसका नाम और मानकों से एक नई वस्तु को प्रारंभ करने के लिए एक सरल तरीका है इसका एक उदाहरण यह है कि कोई इसका उपयोग कैसे कर सकता है, जिसमें वर्ग नाम [या आंशिक वर्ग नाम] और पैरामीटर वाली फ़ाइल को पढ़ना है और उसके बाद मूल प्रकार की ऑब्जेक्ट्स की सूची में लौटाई गई वस्तुएं जोड़ें जो कि कॉमो है बनाई गई वस्तुओं के लिए एन।

देखने के लिए क्या अपने वर्ग के नाम [या] की तरह दिखना चाहिए, अस्थायी रूप से कुछ इस तरह का उपयोग करें [अगर अपनी कक्षा NewClass नाम पर है]:

string z = (new NewClass(args)).GetType().FullName; 
33

यह निर्भर करता है जिस पर विधानसभा वर्ग है।यदि यह mscorlib में है या बुला विधानसभा आप सभी की जरूरत

Type type = Type.GetType("namespace.class"); 

है लेकिन अगर यह कुछ अन्य विधानसभा से संदर्भित है, तुम क्या करने की आवश्यकता होगी: यदि आप केवल वर्ग के नाम है, तो

Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly; 
Type type = assembly.GetType("namespace.class"); 

//or 

Type type = Type.GetType("namespace.class, assembly"); 

"MyClass", तो आपको नामस्थान नाम (या दोनों नामस्थान नाम और असेंबली नाम दोनों संदर्भित असेंबली के मामले में) प्राप्त करना होगा और कक्षा के नाम के साथ मिलकर मिलना होगा। कुछ की तरह:

//if class is in same assembly 
var namespace = typeof(SomeKnownTypeInNamespace).Namespace; 
Type type = Type.GetType(namespace + "." + "MyClass"); 


//or for cases of referenced classes 
var assembly = typeof(SomeKnownTypeInAssembly).Assembly; 
var namespace = typeof(SomeKnownTypeInNamespace).Namespace; 
Type type = assembly.GetType(namespace + "." + "MyClass"); 
//or 
Type type = Type.GetType(namespace + "." + "MyClass" + ", " + assembly.GetName().Name); 

आप पूरी तरह कुछ भी नहीं लेकिन सिर्फ वर्ग के नाम, तो आप एक से मिलता जुलता स्ट्रिंग चयन करने के लिए पूरे विधानसभाओं क्वेरी कर सकता है (यहां तक ​​कि विधानसभा का नाम या नाम स्थान नाम की कोई preawareness) है। लेकिन वह बहुत धीमी होना चाहिए:

Type type = AppDomain.CurrentDomain.GetAssemblies() 
            .SelectMany(x => x.GetTypes()) 
            .FirstOrDefault(x => x.Name == "MyClass"); 

ध्यान दें कि यह पहला मिलान वर्ग देता है, तो बहुत ही सटीक होने की ज़रूरत नहीं है, तो आप भर में विधानसभाओं/नामस्थान ही नाम के साथ कई वर्गों के लिए होगा। किसी भी मामले में मूल्यों को कैश करना यहां समझ में आता है। थोड़ा तेज़ तरीका ग्रहण करने के लिए वहाँ एक डिफ़ॉल्ट नाम स्थान है:

Type type = AppDomain.CurrentDomain.GetAssemblies() 
            .Select(a => new { a, a.GetTypes().First().Namespace }) 
            .Select(x => x.a.GetType(x.Namespace + "." + "MyClass")) 
            .FirstOrDefault(x => x != null); 

लेकिन वह फिर से एक धारणा है कि अपने प्रकार विधानसभा में कुछ अन्य यादृच्छिक वर्ग के रूप में एक ही नाम स्थान होगा है; बहुत भंगुर, बहुत अच्छा नहीं।


आप निम्नलिखित this link. फिर आप उसी क्वेरी किए जाने के रूप में प्रत्येक डोमेन के लिए ऊपर दिखाए गए कर सकते हैं अन्य डोमेन की कक्षाओं आप सभी आवेदन डोमेन की एक सूची प्राप्त कर सकते हैं, चाहते हैं। यदि आपका असेंबली जहां टाइप रहता है अभी तक लोड नहीं किया गया है, तो आपको Assembly.Load, Assembly.LoadFrom आदि

संबंधित मुद्दे