web-dev-qa-db-fra.com

Comment passer des paramètres à Activator.CreateInstance <T> ()

Je veux créer une instance d'un type que je spécifie dans une méthode générique que j'ai. Ce type a un certain nombre de constructeurs surchargés. J'aimerais pouvoir passer des arguments aux constructeurs, mais

Activator.CreateInstance<T>()

ne voit pas cela comme une option.

Y a-t-il une autre façon de le faire?

206
DaveDev

Oui.

(T)Activator.CreateInstance(typeof(T), param1, param2);
404
SLaks

Il existe un autre moyen de transmettre des arguments à CreateInstance via des paramètres nommés.

Sur cette base, vous pouvez passer un tableau vers CreateInstance. Cela vous permettra d'avoir 0 ou plusieurs arguments.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
14
sudhAnsu63

Comme alternative à Activator.CreateInstance, FastObjectFactory dans les préformes d'URL liées est meilleur qu'Activator (à partir de .NET 4.0 et bien meilleur que .NET 3.5. Aucun test/statistique effectué avec .NET 4.5). Voir l'article de StackOverflow pour les statistiques, les informations et le code:

Comment passer les arguments de ctor dans Activator.CreateInstance ou utiliser IL?

6
thames

N'oubliez pas cependant que le passage d'arguments à Activator.CreateInstance a une différence de performances significative par rapport à la création sans paramètre.

Il existe de meilleures alternatives pour créer dynamiquement des objets à l'aide de lambda pré-compilé. Bien sûr, la performance est toujours subjective et dépend clairement de chaque cas, que cela en vaille la peine ou non.

Détails sur la question de cet article.

Le graphique est tiré de l'article et représente le temps pris en ms pour 1000 appels.

Performance comparison

4