2009-03-03 20 views
6

.NET'te bir dize bir Type nesnesine dönüştürmenin en iyi yolu nedir?.NET'te bir dizgeden Type nesnesini almanın en iyi yolu

Sorunlar dikkate almak:

  • tipi farklı bir derlemede olabilir.
  • Yazının türü henüz yüklenmemiş olabilir.

Bu benim girişimi olduğunu, ancak bunu yapmak için Type.GetType(string) kullanabilirsiniz ikinci konuyu

Public Function FindType(ByVal name As String) As Type 
    Dim base As Type 

    base = Reflection.Assembly.GetEntryAssembly.GetType(name, False, True) 
    If base IsNot Nothing Then Return base 

    base = Reflection.Assembly.GetExecutingAssembly.GetType(name, False, True) 
    If base IsNot Nothing Then Return base 

    For Each assembly As Reflection.Assembly In _ 
     AppDomain.CurrentDomain.GetAssemblies 
     base = assembly.GetType(name, False, True) 
     If base IsNot Nothing Then Return base 
    Next 
    Return Nothing 
End Function 
+0

İkinci durumun ele alınması zordur. Boşaltılan meclislerin nerede kaldığı hakkında nasıl bilgi edinilir? Aksi halde [bu cevap] 'a bakın (http://stackoverflow.com/a/7286354/661933), oldukça iyi. – nawfal

cevap

3

İkinci için GetReferencedAssemblies() yöntemini çağırmanız gerekebilir.

namespace reflectme 
{ 
    using System; 
    public class hello 
    { 
     public hello() 
     { 
      Console.WriteLine("hello"); 
      Console.ReadLine(); 
     } 
     static void Main(string[] args) 
     { 
      Type t = System.Reflection.Assembly.GetExecutingAssembly().GetType("reflectme.hello"); 
      t.GetConstructor(System.Type.EmptyTypes).Invoke(null); 
     } 
    } 
} 
9

ele almaz. Tip adı montaj nitelikli olmalıdır, ancak yöntem gerektiği şekilde montajı yükleyecektir. Tür, mscorlid veya GetType çağrısını yürüten derleme olması durumunda derleme nitelemesi gerekli değildir.

+0

Türün bulunmaması durumunda bu durumun bir istisna atmadığını unutmayın, null değerini döndürür. Eğer türün var olmasını bekliyorsanız, Type.GetType (string, bool) aşırı yükünü kullanmanız ve true yazmanız yeterlidir. –

+0

"assembly qualified", aşağıdaki gibi FULL tip adını koymanız gerektiği anlamına gelir: "NLog, Sürüm = 1.0.0.505, Culture = neutral, PublicKeyToken = 5120e14c03d0593c, processorArchitecture = MSIL" –

+0

Bu bana fazla yardımcı olmuyor. Bana tam isimle sahip olma şansım sıfır. –

İlgili konular