Crear una instancia de una clase a partir de una cadena

¿Hay alguna manera de crear una instancia de una clase basada en el hecho de que sé 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 .

He usado este método con éxito:

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

Deberá convertir el objeto devuelto al tipo de objeto deseado.

Es bastante simple. Suponga que su nombre de clase es Car y el espacio de nombre es Vehicles , luego pase el parámetro como Vehicles.Car que devuelve 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 Completamente Calificado (es decir, Vehicles.Car en este caso) está en otro ensamblado, Type.GetType será nulo. En tales casos, tiene un bucle en todos los ensamblajes y encuentra 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); 

Probablemente mi pregunta debería haber sido más específica. De hecho, conozco una clase base para la cadena y 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 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 usar una interfaz para definir tus objetos como aspectos de acceso público.

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

Parece que describió la solución que desea implementar, pero no el problema que está tratando de resolver.

Quizás esté tratando de hacer algo con la extensibilidad, en cuyo caso le sugiero que consulte el Marco de Extensibilidad Administrado .

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), a partir de esos datos de campo, podría, posiblemente, crea una clase de cualquier tipo usando el código anterior, y rellena con el valor del primer campo. Esto, por supuesto, depende del tipo que está almacenando con un método para analizar las cadenas en el tipo correcto. Lo he usado muchas veces para almacenar configuraciones de preferencias de usuario en una base de datos.

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

¿Por qué quieres escribir un código como este? Si tiene una clase ‘ReportClass’ 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 utiliza cuando no tiene la clase necesaria disponible, pero desea instanciar y / o invocar un método dinámicamente.

Quiero decir que es útil cuando conoces el conjunto, pero mientras escribes el código no tienes disponible la clase ReportClass .