Crear una instancia de una clase a partir de una cadena
¿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.
Eche un vistazo al método Activator.CreateInstance .
Es bastante simple. Suponga que su nombre de clase es Car
y el espacio de nombres es Vehicles
, luego pase el parámetro Vehicles.Car
que 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.Car
en este caso) está en otra asamblea, Type.GetType
será 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);
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.
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.