Crear una instancia de una clase a partir de una cadena

Resuelto PeteT asked hace 16 años • 8 respuestas

¿Hay alguna manera de crear una instancia de una clase basándose en el hecho de que conozco el nombre de la clase en tiempo de ejecución? Básicamente tendría el nombre de la clase en una cadena.

PeteT avatar Oct 22 '08 06:10 PeteT
Aceptado

Eche un vistazo al método Activator.CreateInstance .

Matt Hamilton avatar Oct 21 '2008 23:10 Matt Hamilton

Es bastante simple. Suponga que su nombre de clase es Cary el espacio de nombres es Vehicles, luego pase el parámetro Vehicles.Carque devuelve el objeto de tipo Car. De esta manera puedes crear cualquier instancia de cualquier clase dinámicamente.

public object GetInstance(string strFullyQualifiedName)
{         
     Type t = Type.GetType(strFullyQualifiedName); 
     return  Activator.CreateInstance(t);         
}

Si su nombre completo (es decir, Vehicles.Caren este caso) está en otra asamblea, Type.GetTypeserá nulo. En tales casos, debe recorrer todos los ensamblados y encontrar el archivo Type. Para eso puedes usar el siguiente código.

public object GetInstance(string strFullyQualifiedName)
{
     Type type = Type.GetType(strFullyQualifiedName);
     if (type != null)
         return Activator.CreateInstance(type);
     foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
     {
         type = asm.GetType(strFullyQualifiedName);
         if (type != null)
             return Activator.CreateInstance(type);
     }
     return null;
 }

Ahora, si desea llamar a un constructor parametrizado, haga lo siguiente

Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type

en lugar de

Activator.CreateInstance(t);
Sarath Subramanian avatar Nov 25 '2014 05:11 Sarath Subramanian

He utilizado este método con éxito:

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)

Deberá convertir el objeto devuelto al tipo de objeto que desee.

Ray Li avatar Oct 21 '2008 23:10 Ray Li

Probablemente mi pregunta debería haber sido más específica. De hecho, conozco una clase base para la cadena, así que la resolví de la siguiente manera:

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

La clase Activator.CreateInstance tiene varios métodos para lograr lo mismo de diferentes maneras. Podría haberlo lanzado a un objeto, pero lo anterior es de gran utilidad para mi situación.

PeteT avatar Oct 22 '2008 00:10 PeteT