¿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.Crear una instancia de una clase a partir de una cadena
Respuesta
Eche un vistazo al método Activator.CreateInstance.
He utilizado este método con éxito:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
Tendrá que convertir el objeto devuelto a su tipo de objeto deseado.
hm .. resulta que los nombres de usuario no son únicos. – Ray
Estoy tratando de imaginar un escenario donde crear el objeto a través del nombre de clase y luego lanzarlo como ese tipo tendría algún sentido. – MusiGenesis
Veo a qué te refieres. Parece redundante. Si conoce el nombre de la clase, ¿por qué necesita la cadena dinámica? Una situación podría ser que su conversión a una clase base y la cadena representa descendientes de esa clase base. – dailymorn
Probablemente mi pregunta debería haber sido más específica. Sé realmente una clase base para la cadena por lo resolvió por:
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.
En lugar de responder en la sección de preguntas, le sugiero que edite su pregunta y observe los cambios. Obtendrá más/mejores respuestas para hacerlo. –
Gracias por publicar la línea específica de código que funcionó para usted. Clasificar a través de todas las sobrecargas de CreateInstance y diferentes formas de generar Types me estaba llevando mucho tiempo, lo cual me salvó. –
Parece que ha descrito 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 Managed Extensibility Framework.
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 usted no tiene la clase necesaria disponible, pero que desea crear una instancia y o o invocar un método de forma dinámica.
Quiero decir que es útil cuando conoces el conjunto pero al escribir el código no tienes la clase ReportClass
disponible.
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), de esos datos de campo, podría, concebiblemente, crear una clase de cualquier tipo usando el código anterior, y poblarlo 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.
Sé que llego tarde al juego ... pero la solución que está buscando podría ser la combinación de lo anterior y el uso de una interfaz para definir los objetos a los que se puede acceder públicamente.
Entonces, si todas sus clases que se generarían de esta manera implementan esa interfaz, puede simplemente convertir como el tipo de interfaz y trabajar con el objeto resultante.
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 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 Fully Qualified Name (es decir, Vehicles.Car
en este caso) es en otro montaje, el Type.GetType
será nulo. En tales casos, tiene un ciclo en todos los ensamblajes y encuentra el Type
. Para que se puede 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 bien, si desea llamar a un constructor con parámetros hacer lo siguiente
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
en lugar de
Activator.CreateInstance(t);
¿Cómo usarlo sin emitir y cómo hacer el reparto __de la cadena dada__? – TaW
@TaW: para usar una instancia de clase, necesitará tener un conocimiento de lo que va a hacer; de lo contrario, no podrá usarla. El caso de uso más común para esto sería enviar contenido a alguna interfaz que le da un contrato predefinido. (Esto se mantiene a menos que esté usando el código 'dinámico' - vea http://stackoverflow.com/a/2690661/904521) –
- 1. Crear URL a partir de una cadena
- 2. Crear una instancia de una clase Python a partir de un nombre
- 3. Java cómo crear una instancia de una clase de cadena
- 4. cómo crear una instancia de un objeto de clase a partir de una cadena en Objective-C?
- 5. ¿Puede PHP crear una instancia de un objeto a partir del nombre de la clase como una cadena?
- 6. cómo crear XElement a partir de una cadena?
- 7. Creando una instancia de JdbcTemplate a partir de una java.sql.Connection
- 8. ¿Cómo creo una instancia a partir de una cadena en C#?
- 9. Cómo crear una instancia nueva a partir de un objeto de clase en Python
- 10. ¿Cómo puedo crear una nueva instancia de clase de una clase dentro de una clase (estática)?
- 11. Crear método anónimo a partir de una cadena en C#
- 12. Crear una instancia de una clase python en C#
- 13. ¿Cómo escribo una macro de Clojure para crear una expresión regular a partir de una cadena?
- 14. cómo crear dinámicamente una instancia de una clase en python?
- 15. crear una nueva instancia de una clase sin operador "nuevo"
- 16. una instancia de una clase a partir de su nombre textual
- 17. manera maravillosa para crear dinámicamente una instancia de una clase de cadena
- 18. cómo crear el árbol de expresiones/lambda para una propiedad profunda a partir de una cadena
- 19. ¿Cómo creo una matriz numpy a partir de una cadena?
- 20. Cómo copiar/crear una instancia de clase derivada desde un puntero a una clase base polimórfica?
- 21. Extraer una cadena a partir de una trama de datos
- 22. Java una instancia de clase de la cadena
- 23. Generar una clase a partir de cadenas y crear instancias en Scala 2.10
- 24. Crear una clase de cadena personalizada
- 25. Creación de instancia de clase PHP con una cadena
- 26. Crear una nueva expresión a partir de una expresión existente
- 27. Cómo crear una matriz Haskell a partir de una función
- 28. volver más de una instancia de una clase interna anónima
- 29. ¿Cómo puedo generar una secuencia a partir de una cadena?
- 30. Python: crear una instancia de clase sin invocar el inicializador
Relacionado con grandes ejemplos: http : //stackoverflow.com/questions/493490/converting-a-string-to-a-class-name –
También esta publicación será relevante también, ya que debe buscar su tipo: http: // st ackoverflow.com/questions/1825147/type-gettypenamespace-ab-classname-returns-null –
Ejemplos: http://stackoverflow.com/questions/7598088/purpose-of-activator-createinstance-with-example – profimedica