web-dev-qa-db-fra.com

Comment créer une instance pour un type donné?

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?

19
Jader Dias

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.

21
Jon Skeet

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>();
14
jgauffin
Activator.CreateInstance(type)
0
M.A. Hanin