2009-03-03 15 views
6

¿Cuál es la mejor forma de convertir una cadena en un objeto Type en .NET?La mejor manera de obtener un objeto Type a partir de una cadena en .NET

Los aspectos a considerar:

  • El tipo puede estar en un montaje diferente.
  • El ensamblaje del tipo puede que aún no se haya cargado.

Este es mi intento, pero no se refiere a la segunda cuestión

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

Abordar el segundo caso es difícil. ¿Cómo saber genéricamente dónde residen los ensamblajes descargados? De lo contrario, ver [esta respuesta] (http://stackoverflow.com/a/7286354/661933), bastante bueno. – nawfal

Respuesta

3

es posible que necesite llamar al método GetReferencedAssemblies() para el segundo.

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

Puede utilizar Type.GetType(string) con el fin de hacer esto. El nombre del tipo debe ser ensamblado, pero el método cargará el ensamblaje según sea necesario. La calificación de ensamblaje no es necesaria si el tipo está en mscorlid o el ensamblado que ejecuta la llamada GetType.

+0

Tenga en cuenta que esto no arroja una excepción si el tipo no se encuentra, devuelve nulo. Si espera que el tipo exista, vale la pena utilizar la sobrecarga Type.GetType (string, bool) y pasar true, que se lanza si el tipo no se puede cargar. –

+0

"ensamblado calificado" significa que debe poner el nombre de tipo COMPLETO, así: "NLog, Versión = 1.0.0.505, Cultura = neutral, PublicKeyToken = 5120e14c03d0593c, processorArchitecture = MSIL" –

+0

Eso no me ayuda mucho, hay Cero posibilidades de que tenga nombres completamente calificados. –

Cuestiones relacionadas