2009-03-03 10 views
6

Was ist der beste Weg, um eine Zeichenfolge in .NET in ein Type-Objekt zu konvertieren?Die beste Methode, um ein Type-Objekt aus einer Zeichenfolge in .NET zu erhalten

Fragen zu berücksichtigen:

  • Der Typ in einer anderen Anordnung sein kann.
  • Die Baugruppe des Typs ist möglicherweise noch nicht geladen.

Dies ist mein Versuch, aber es geht nicht auf die zweite Ausgabe

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

Die Adressierung des zweiten Falles ist schwierig. Wie kann man allgemein wissen, wo sich die unbestückten Baugruppen befinden? Ansonsten siehe [diese Antwort] (http://stackoverflow.com/a/7286354/661933), ziemlich gut. – nawfal

Antwort

3

müssen Sie möglicherweise GetReferencedAssemblies() -Methode für die zweite aufrufen.

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

Sie Type.GetType(string), um dies zu tun, verwenden können. Der Typname muss montagerecht sein, aber die Methode lädt die Assembly nach Bedarf. Die Assembly-Qualifikation ist nicht erforderlich, wenn sich der Typ in mscorlid oder der Assembly befindet, die den GetType-Aufruf ausführt.

+0

Beachten Sie, dass dies keine Ausnahme auslöst, wenn der Typ nicht gefunden wird, gibt es null zurück. Wenn Sie erwarten, dass der Typ vorhanden ist, sollten Sie die Überladung Type.GetType (string, bool) verwenden und true übergeben, die auslöst, wenn der Typ nicht geladen werden kann. –

+0

"Assembly-qualifiziert" bedeutet, dass Sie den vollständigen Typnamen wie folgt eingeben müssen: "NLog, Version = 1.0.0.505, Kultur = neutral, PublicKeyToken = 5120e14c03d0593c, ProzessorArchitektur = MSIL" –

+0

Das hilft mir nicht viel, gibt es Null Chance, dass ich voll qualifizierte Namen habe. –

Verwandte Themen