¿Alguien puede explicar el Activator.CreateInstance()
propósito en detalle?
c#
.net
reflection
Tabriz Atayi
fuente
fuente
CreateInstance(Type type)
coincida con laCreateInstance<T>()
sobrecarga.c#.net
forma de hacerloObject xyz = Class.forName(className).newInstance();
.Respuestas:
Digamos que tiene una clase llamada
MyFancyObject
como esta a continuación:Te permite convertir:
Dentro
Utilizando
y luego puede hacer cosas como:
Ese es su propósito. También tiene muchas otras sobrecargas, como proporcionar un
Type
nombre en lugar del nombre de la clase en una cadena. Por qué tendría un problema así es una historia diferente. Aquí hay algunas personas que lo necesitaban:fuente
String ClassName = "My.Namespace.MyFancyObject";
).obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
pero en lugar de lanzar con el tipo? ¿Reparto con tipo hecho desde ClassName? Me gusta estoType type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?Bueno, puedo darte un ejemplo de por qué usar algo así. Piensa en un juego donde quieras almacenar tu nivel y tus enemigos en un archivo XML. Cuando analiza este archivo, es posible que tenga un elemento como este.
lo que puede hacer ahora es crear dinámicamente los objetos encontrados en su archivo de nivel.
Esto es muy útil para construir entornos dinámicos. Por supuesto, también es posible usar esto para escenarios de complementos o complementos y mucho más.
fuente
Mi buen amigo MSDN te lo puede explicar, con un ejemplo
Aquí está el código en caso de que el enlace o el contenido cambien en el futuro:
fuente
También puedes hacer esto:
fuente
.Unwrap()
hace precisamente y cómo se relaciona esto con otras soluciones?CreateInstance
donde regresaSystem.Runtime.Remoting.ObjectHandle
.Un buen ejemplo podría ser el siguiente: por ejemplo, tiene un conjunto de registradores y permite al usuario especificar el tipo que se utilizará en tiempo de ejecución a través del archivo de configuración.
Luego:
O otro caso es cuando tiene una fábrica de entidades comunes, que crea una entidad, y también es responsable de la inicialización de una entidad por los datos recibidos de DB:
(pseudocódigo)
fuente
typeof(loggerType)
resultados enloggerType is a variable and used like a type
El
Activator.CreateInstance
método crea una instancia de un tipo especificado utilizando el constructor que mejor coincide con los parámetros especificados.Por ejemplo, supongamos que tiene el nombre del tipo como una cadena y desea usar la cadena para crear una instancia de ese tipo. Podrías usar
Activator.CreateInstance
para esto:Aquí hay un artículo de MSDN que explica su aplicación con más detalle:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
fuente
new Foo()
. Creo que el OP quería un ejemplo más realista.CreateInstance
es si no conoce el tipo de objeto que va a instanciar en el momento del diseño. En este ejemplo, claramente sabe que es de tipo,Foo
ya que lo está convirtiendo como tipoFoo
. Nunca harías esto porque solo puedes hacerloFoo foo = new Foo()
.Partiendo de deepee1 y esto , aquí se explica cómo aceptar un nombre de clase en una cadena y luego usarlo para leer y escribir en una base de datos con LINQ. Uso "dinámico" en lugar de la conversión de deepee1 porque me permite asignar propiedades, lo que nos permite seleccionar dinámicamente y operar en cualquier tabla que queramos.
fuente
¿Por qué lo usarías si ya conocías la clase y la ibas a lanzar? ¿Por qué no simplemente hacerlo a la antigua usanza y hacer que la clase como siempre lo hagas? Esto no tiene ninguna ventaja sobre la forma en que se hace normalmente. ¿Hay alguna manera de tomar el texto y operarlo de esta manera?
Si ya sé que es una pizza, no hay ventaja para:
pero veo una gran ventaja para el método Magic si existe.
fuente
Junto con la reflexión, descubrí que Activator.CreateInstance es muy útil para asignar el resultado del procedimiento almacenado a una clase personalizada como se describe en la siguiente respuesta .
fuente