2010-03-16 18 views
161

Ich möchte eine Instanz eines Typs erstellen, die ich in einer generischen Methode angeben, die ich habe. Dieser Typ hat eine Anzahl überladener Konstruktoren. Ich möchte in der Lage sein, Argumente zu den Konstrukteuren passieren, aberSo übergeben Sie Parameter an Activator.CreateInstance <T>()

Activator.CreateInstance<T>() 

nicht sieht dies als eine Option zu haben.

Gibt es einen anderen Weg, es zu tun?

+3

möglich Duplikat [Activator.CreateInstance - Wie Instanzen von Klassen erstellen, die parametrisierte Konstruktoren] (http://stackoverflow.com/questions/1288310/activator-createinstance-how-to-create-instances- of-classes-that-have-parameter) – nawfal

Antwort

306

Yes.

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

Als Alternative zu Activator.CreateInstance, FastObjectFactory in dem verknüpften URL Preforms besser als Aktivator (ab .NET 4.0 und deutlich besser als .NET 3.5. Keine Tests/stats erledigt. NET 4.5). Siehe Beitrag für Stackoverflow Statistiken, Informationen und Code:

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

+0

Meinst du, dass es eine alternative Lösung (verknüpft) gibt, die wahrscheinlich bessere Ergebnisse liefert als Activator.CreateInstance, wenn Sie Parameter übergeben? Oder wird das wahrscheinlich in allen Fällen besser sein? –

+1

Ich habe seit einiger Zeit keine Leistungstests durchgeführt und es sieht so aus, als hätte jemand .NET 4.0-Statistiken gepostet, aber mit .NET 4.0 sieht es aus, als hätte FastObjectFactory eine bessere Leistung. Activator.CreateInstance war schrecklich in .NET 3.5 und war in .NET 4.0 wesentlich schneller, jedoch langsamer als FastObjectFactory, das in dieser URL verlinkt war. – thames

8

Es gibt eine andere Art und Weise ist Argument zu übergeben durch benannte Parameter createInstance.

Darauf basierend können Sie ein Array in Richtung CreateInstance übergeben. Dies ermöglicht Ihnen, 0 oder mehrere Argumente zu haben.

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

Dies scheint unvollständig, sicherlich müssen Sie ein Objekt vom Typ T zurückgeben, anstatt void? öffentliche T CreateInstance (Parameter Objekt [] paraMatrach) { Rückkehr (T) Activator.CreateInstance (typeof (T), args: paraMatrray); } – wlf