Avec les génériques, vous pouvez
var object = default(T);
Mais quand tout ce que vous avez est une instance de type, je ne pouvais que
constructor = type.GetConstructor(Type.EmptyTypes);
var parameters = new object[0];
var obj = constructor.Invoke(parameters);
ou même
var obj = type.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);
N'y a-t-il pas un moyen plus court, comme la version générique?
Le plus proche disponible est Activator.CreateInstance
:
object o = Activator.CreateInstance(type);
... mais bien sûr, cela repose sur l'existence d'un constructeur public sans paramètre. (D'autres surcharges vous permettent de spécifier des arguments de constructeur.)
J'ai utilisé une variable explicitement typée ici pour préciser que nous n'avons pas de variable du type lui-même ... vous ne pouvez pas écrire:
Type t = typeof(MemoryStream);
// Won't compile
MemoryStream ms = Activator.CreateInstance(t);
par exemple. Le type de compilation de la valeur de retour de CreateInstance
est toujours object
.
Notez que default(T)
non créer une instance d'un type de référence - il donne la valeur par défaut pour le type, qui est une référence null pour les types de référence. Comparez cela avec CreateInstance
qui créerait un nouvel objet.
var myObject = Activator.CreateInstance(myType)
Vous devez lancer si vous souhaitez utiliser un paramètre typé:
User user = (User)Activator.CreateInstance(typeof(User));
.. ou avec des paramètres
User user = (User)Activator.CreateInstance(typeof(User), new object[]{firstName, lastName});
Vous pouvez également utiliser des génériques:
public T Create<T>() where T : class, new()
{
return new T();
}
var user = Create<User>();
Activator.CreateInstance(type)