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?
(T)Activator.CreateInstance(typeof(T), param1, param2);
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);
}
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?
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.