2008-09-11 3 views
11

Nein, dies ist keine Frage über Generika.Activator.CreateInstance (String) und Activator.CreateInstance <T>() Unterschied

Ich habe ein Factory-Muster mit mehreren Klassen mit internen Konstruktoren (ich will nicht, dass sie instanziiert werden, wenn nicht durch die Fabrik).

Mein Problem ist, dass CreateInstance mit einem Fehler "kein parameterless Konstruktor für dieses Objekt definiert" fehlschlägt, es sei denn, ich übergeben "True" auf den nicht öffentlichen Parameter.

Beispiel

// Fails 
Activator.CreateInstance(type); 

// Works 
Activator.CreateInstance(type, true); 

ich die Fabrik generic, um es ein wenig einfacher, wie diese machen wollte:

public class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return Activator.CreateInstance<T>(); 
    } 
} 

Allerdings war ich nicht in der Lage zu finden, wie man sich zu, daß „true“ Parameter, um nicht-öffentliche Konstruktoren (intern) zu akzeptieren.

Habe ich etwas übersehen oder ist das nicht möglich?

+2

hat Warum nicht einen parameterlosen Konstruktor mit dem privaten boolean Variable auf true gesetzt definieren? – Vivek

Antwort

20

Um dies zu umgehen, könnten nicht Sie nur Ihre Nutzung als solche verändern:

public class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return Activator.CreateInstance(typeof(T), true); 
    } 
} 

Ihre Factory-Methode generisch sein wird nach wie vor, aber der Anruf an den Aktivator nicht die allgemeine Überlastung verwenden. Aber Sie sollten immer noch die gleichen Ergebnisse erzielen.

+0

Schöne Workaround, aber ich würde gerne wissen, ob es auch möglich ist – juan

+0

Wenn die Überlastung nicht existiert, würde ich nein sagen. – Kilhoffer

3

Wenn Sie unbedingt erforderlich, dass der Konstruktor privat sein Sie so etwas wie dies versuchen:

public abstract class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return (T)Activator.CreateInstance(typeof(T), true); 
    } 
} 

Ansonsten sind Sie am besten aus Hinzufügen der neuen Zwang und gehen diesen Weg:

public abstract class GenericFactory<T> where T : MyAbstractType, new() 
{ 
    public static T GetInstance() 
    { 
     return new T; 
    } 
} 

Sie versuchen Sie, GenericFactory als Basisklasse für alle Ihre Fabriken zu verwenden, anstatt jedes von Grund auf neu zu schreiben?

+0

Die erste Option ist die gleiche wie die von Kilhoffer Die zweite wird nicht funktionieren, Hinzufügen von new() zu der wo der Typ benötigt, um einen öffentlichen Parameter, der genau das ist, was ich nicht will – juan

+0

Yeah, sein Beitrag erschien, als ich meins tippte. – rpetrich

0

neben Activator.CreateInstance (typeof (T), true) zu arbeiten, sollte T Standardkonstruktors

Verwandte Themen