c# .net generics reflection constructor

c# - ¿Cómo crear una instancia para un tipo dado?



.net generics (3)

El más cercano disponible es Activator.CreateInstance :

object o = Activator.CreateInstance(type);

... pero, por supuesto, esto depende de que haya un constructor público sin parámetros. (Otras sobrecargas le permiten especificar argumentos de constructor).

He usado una variable explícitamente escrita aquí para aclarar que realmente no tenemos una variable del tipo en sí ... no se puede escribir:

Type t = typeof(MemoryStream); // Won''t compile MemoryStream ms = Activator.CreateInstance(t);

por ejemplo. El tipo de tiempo de compilación del valor de retorno de CreateInstance es siempre object .

Tenga en cuenta que el default(T) no creará una instancia de un tipo de referencia; proporciona el valor predeterminado para el tipo, que es una referencia nula para los tipos de referencia. Compare eso con CreateInstance que realmente crearía un nuevo objeto.

Esta pregunta ya tiene una respuesta aquí:

Con genéricos puedes

var object = default(T);

Pero cuando todo lo que tienes es una instancia de Type solo pude

constructor = type.GetConstructor(Type.EmptyTypes); var parameters = new object[0]; var obj = constructor.Invoke(parameters);

o incluso

var obj = type.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);

¿No hay un camino más corto, como la versión genérica?


var myObject = Activator.CreateInstance(myType)

Tienes que lanzar si quieres usar un parámetro escrito:

User user = (User)Activator.CreateInstance(typeof(User));

.. o con parametros

User user = (User)Activator.CreateInstance(typeof(User), new object[]{firstName, lastName});

También puedes usar genéricos:

public T Create<T>() where T : class, new() { return new T(); } var user = Create<User>();


Activator.CreateInstance(type)