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í:
- Cómo crear una nueva instancia de objeto a partir de respuestas tipo 12
- Equivalente programático de default (Tipo) 13 respuestas
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)