2009-03-03 16 views
6

Qual è il modo migliore per convertire una stringa in un oggetto Type in .NET?Il modo migliore per ottenere un oggetto Type da una stringa in .NET

Problemi da considerare:

  • Il tipo può essere in un assembly diverso.
  • L'assembly del tipo potrebbe non essere ancora caricato.

Questo è il mio tentativo, ma non affronta il secondo numero

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

Affrontare il secondo caso è difficile. Come sapere genericamente dove risiedono gli assemblaggi scaricati? Altrimenti vedi [questa risposta] (http://stackoverflow.com/a/7286354/661933), abbastanza buono. – nawfal

risposta

3

potrebbe essere necessario chiamare il metodo GetReferencedAssemblies() per il secondo.

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

È possibile utilizzare Type.GetType(string) al fine di fare questo. Il nome del tipo deve essere qualificato per l'assemblaggio ma il metodo caricherà l'assembly secondo necessità. La qualifica dell'assembly non è necessaria se il tipo è in mscorlid o l'assembly che esegue la chiamata GetType.

+0

Si noti che questo non genera un'eccezione se il tipo non viene trovato, restituisce null. Se si prevede che il tipo esista, vale la pena utilizzare il sovraccarico Type.GetType (string, bool) e true, che genera se il tipo non può essere caricato. –

+0

"assembly qualified" significa che devi inserire il nome di tipo FULL, come questo: "NLog, Version = 1.0.0.505, Culture = neutral, PublicKeyToken = 5120e14c03d0593c, processorArchitecture = MSIL" –

+0

Questo non mi aiuta molto, c'è nessuna possibilità di avere nomi completi. –

Problemi correlati