2010-03-16 11 views
161

Je souhaite 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. Je voudrais être en mesure de transmettre des arguments aux constructeurs, maisComment transmettre les paramètres à Activator.CreateInstance <T>()

Activator.CreateInstance<T>() 

ne voit pas d'avoir cette option.

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

+3

double possible de [Activator.CreateInstance - Comment créer des instances de classes qui ont des constructeurs paramétrés] (http://stackoverflow.com/questions/1288310/activator-createinstance-how-to-create-instances- of-classes-that-have-paramete) – nawfal

Répondre

306

Yes.

(T)Activator.CreateInstance(typeof(T), param1, param2); 
6

Comme alternative à Activator.CreateInstance, FastObjectFactory dans les préformes url liées mieux que Activator (en .NET 4.0 et nettement mieux que .NET 3.5. Aucun test/stats fait avec. NET 4.5). Voir post StackOverflow pour les statistiques, les informations et le code:

How to pass ctor args in Activator.CreateInstance or use IL?

+0

Voulez-vous dire qu'il existe une autre solution (liée) susceptible de fonctionner mieux que Activator.CreateInstance lorsque vous transmettez des paramètres? Ou cela est susceptible de mieux fonctionner dans tous les cas? –

+1

Je n'ai pas fait de tests de performance depuis un moment et on dirait que quelqu'un a posté des stats .NET 4.0, mais oui avec .NET 4.0 il semble que FastObjectFactory ait de meilleures performances. Activator.CreateInstance était horrible dans .NET 3.5 et était significativement plus rapide dans .NET 4.0 mais toujours plus lent que FastObjectFactory lié dans cette URL. – thames

8

Il y a une autre façon de passer des arguments à createInstance par des paramètres nommés. À partir de là, vous pouvez passer un tableau vers CreateInstance. Cela vous permettra d'avoir 0 ou plusieurs arguments.

public void CreateInstance<T>(params object[] paramArray) 
{ 
    (T)Activator.CreateInstance(typeof(T), args:paramArray); 
} 
+2

Cela semble incomplet, vous avez sûrement besoin de retourner un objet de type T plutôt qu'annuler? public T CreateInstance (paramètres object [] paramArray) { return (T) Activator.CreateInstance (typeof (T), arguments: paramArray); } – wlf