2009-03-03 14 views
6

Jaki jest najlepszy sposób konwersji ciągu znaków na obiekt typu w .NET?Najlepszy sposób na uzyskanie obiektu typu z łańcucha w .NET

Kwestie do rozważenia:

  • Typ może być w innym zespole.
  • Zespół typu może jeszcze nie zostać załadowany.

To moja próba, ale to nie rozwiązuje Druga kwestia

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

Adresowanie drugiego przypadku jest trudne. Jak ogólnie wiedzieć, gdzie znajdują się niezaładowane zespoły? W przeciwnym razie zobacz [tę odpowiedź] (http://stackoverflow.com/a/7286354/661933), całkiem dobrze. – nawfal

Odpowiedz

3

może zajść potrzeba wywołania metody GetReferencedAssemblies() na sekundę.

9

Można użyć Type.GetType(string) w tym celu. Nazwa typu musi mieć kwalifikację zespołu, ale metoda w razie potrzeby załaduje zespół. Kwalifikacja złożenia nie jest konieczna, jeśli typ jest w mscorlid lub zestaw, który wykonuje wywołanie GetType.

+0

Należy zauważyć, że nie spowoduje to wyjątku, jeśli typ nie zostanie znaleziony, zwraca wartość null. Jeśli spodziewasz się, że dany typ istnieje, warto użyć przeciążenia Type.GetType (string, bool) i podania wartości true, która zostanie wygenerowana, jeśli typ nie może zostać załadowany. –

+0

"kwalifikowany do montażu" oznacza, że ​​musisz wpisać nazwę typu PEŁNEGO, na przykład: "NLog, Wersja = 1.0.0.505, Kultura = neutralny, PublicKeyToken = 5120e14c03d0593c, procesorArchitektura = MSIL" –

+0

To mi nie pomoże, jest zero szansy na posiadanie w pełni kwalifikowanych nazw. –

Powiązane problemy