2010-09-07 16 views
11

द्वारा विधानसभा मिल वहाँ किसी भी तरह से विधानसभा उस नाम TestClass के साथ एक कक्षा में शामिल पाने के लिए है? मुझे बस कक्षा का नाम पता है, इसलिए मैं इसका उदाहरण नहीं बना सकता। औरवर्ग के नाम

Type objectType = assembly.GetType("TestClass"); 

मेरे लिए काम नहीं किया।

+3

सभी संदर्भित विधानसभाओं से अधिक पुनरावृत्ति अपने ही एकमात्र विकल्प हो सकता है, लेकिन यह भी आसानी से डुप्लिकेट में परिणाम होगा। लेकिन मुझे पूरा विश्वास नहीं है कि आपके पास सारी जानकारी है, इसलिए आपको अपने प्रश्न के लिए अपने तर्क के बारे में और अधिक स्पष्ट होना चाहिए। –

उत्तर

16

, मुझे लगता है कि आप वास्तव में नाम से प्रकार (नहीं विधानसभा) के बाद कर रहे हैं; इसलिए संभालने विधानसभा लोड और प्रकार का नाम अद्वितीय है, LINQ मदद मिल सकती है:

Type objectType = (from asm in AppDomain.CurrentDomain.GetAssemblies() 
        from type in asm.GetTypes() 
        where type.IsClass && type.Name == "TestClass" 
        select type).Single(); 
object obj = Activator.CreateInstance(objectType); 

हालांकि, यह बेहतर हो सकता है के बजाय विधानसभा से योग्य नाम टाइप नाम के साथ काम करने के लिए।

+0

अनुरोधित प्रकारों में से एक या अधिक लोड करने में असमर्थ। अधिक जानकारी के लिए लोडरएक्सेप्शंस संपत्ति पुनर्प्राप्त करें। – Soonts

+1

@Soonts - शायद वहाँ है एक सभा में एक निर्भरता है कि याद आ रही है की तरह लगता है? –

21
Assembly asm = typeof(TestClass).Assembly; 

जब तक संदर्भित किया जाता है तब तक आप असेंबली प्राप्त करेंगे। अन्यथा, आप एक पूरी तरह से योग्य नाम का उपयोग करना होगा: प्रश्न में Type objectType से

Assembly asm = null; 
Type type = Type.GetType("TestNamespace.TestClass, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 
if (type != null) 
{ 
    asm = type.Assembly; 
} 
3

असल classname का ज्ञान सबसे स्थितियों में पर्याप्त है। MSDN कहते हैं - प्रकार वर्तमान में क्रियान्वित विधानसभा में या mscorlib.dll में है, तो वह अपने नाम स्थान से योग्य प्रकार नाम की आपूर्ति करने के लिए पर्याप्त है।

Type neededType = Type.GetType("TestClass"); //or typeof(TestClass) 
Assembly a = neededType.Assembly; 

मामले में आप विधानसभा युक्त प्रकार पता (हालांकि मैं नहीं कर सकते क्यों की कल्पना) न -

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
Asssembly result = assemblies.FirstOrDefault(a=>a.GetType("TestClass",false)!=null); 

केवल प्रतिबंध - विधानसभा युक्त TestClass पहले से ही इस तरह के कोड को बुलाने की पल में लोड किया जाना चाहिए था ।

आशा इस में मदद करेंगे। :)

2

मार्क का जवाब वास्तव में अच्छा है, लेकिन क्योंकि यह बहुत धीमी गति से किया गया था (मुझे लगता है कि विधि अक्सर उपयोग कर रहा हूँ), मैं एक अलग दृष्टिकोण के साथ जाने का फैसला किया:

private static Dictionary<string, Type> types; 
    private static readonly object GeneralLock = new object(); 

    public static Type FindType(string typeName) 
    { 
     if (types == null) 
     { 
      lock (GeneralLock) 
      { 
       if (types == null) 
       { 
        types = new Dictionary<string, Type>(); 
        var appAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
        foreach (var appAssembly in appAssemblies) 
        { 
         foreach (var type in appAssembly.GetTypes()) 
          if (!types.ContainsKey(type.Name)) 
           types.Add(type.Name, type); 
        } 
       } 
      } 
     } 

     return types[typeName]; 
    } 

आप नाम टकराव संभाल कर सकते हैं जिस तरह से आप चाहते हैं, लेकिन इस उदाहरण में मैंने बाद के लोगों को अनदेखा करने का फैसला किया।

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