Pregunta

¿Existe una manera de crear una instancia de una clase basada 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.

¿Fue útil?

Solución

Echa un vistazo a la Activator.CreateInstance método.

Otros consejos

Es bastante simple. Suponga que su nombre de clase es Car y el espacio de nombres es Vehicles , luego pase el parámetro como Vehicles.Car que devuelve el objeto de tipo Car . De esta forma, 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 totalmente calificado (es decir, < code> Vehicles.Car en este caso) se encuentra en otro ensamblaje, el Type.GetType será nulo. En tales casos, debe recorrer todos los ensamblajes y encontrar el 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 deseado.

Probablemente mi pregunta debería haber sido más específica. En realidad, conozco una clase base para la cadena, así que se resuelve 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 lo más útil para mi situación.

Sé que llego tarde al juego ... pero la solución que estás buscando podría ser la combinación de lo anterior y el uso de una interfaz para definir los objetos de los aspectos de acceso público.

Luego, si todas las clases que se generarían de esta manera implementan esa interfaz, puedes convertirlas como el tipo de interfaz y trabajar con el objeto resultante.

Por ejemplo, si almacena valores de varios tipos en un campo de base de datos (almacenado como cadena) y tiene otro campo con el nombre de tipo (es decir, String, bool, int, MyClass), entonces de esos datos de campo, podría , posiblemente, cree una clase de cualquier tipo utilizando el código anterior y rellénela con el valor del primer campo. Por supuesto, esto depende del tipo que esté almacenando y tenga un método para analizar cadenas en el tipo correcto. Lo he usado muchas veces para almacenar la configuración de preferencias del usuario en una base de datos.

Para crear una instancia de una clase de otro proyecto en la solución, puede obtener el ensamblaje indicado por el nombre de cualquier clase (por ejemplo, BaseEntity) y crear una nueva instancia:

  var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

¿Por qué quieres escribir un código como este? Si tiene una clase 'ReportClass' está disponible, puede crear una instancia directamente como se muestra a continuación.

ReportClass report = new ReportClass();

El código ReportClass report = (ReportClass) Activator.CreateInstance (Type.GetType (reportClass)); se usa cuando no tiene la clase necesaria disponible, pero desea crear una instancia y / o invocar Un método dinámicamente.

Quiero decir que es útil cuando conoces el ensamblaje, pero al escribir el código no tienes la clase ReportClass disponible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top