Unterschied zwischen Activator.CreateInstance(string) und Activator.CreateInstance<T>()

StackOverflow https://stackoverflow.com/questions/57439

  •  09-06-2019
  •  | 
  •  

Frage

Nein, das ist keine Frage zu Generika.

Ich habe ein Factory-Muster mit mehreren Klassen mit internen Konstruktoren (ich möchte nicht, dass sie instanziiert werden, wenn nicht über die Factory).

Mein Problem ist das CreateInstance schlägt mit der Fehlermeldung „Kein Parameterloser Konstruktor für dieses Objekt definiert“ fehl, es sei denn, ich übergebe „true“ für den nicht öffentlichen Parameter.

Beispiel

// Fails
Activator.CreateInstance(type);

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

Ich wollte die Fabrik generisch gestalten, um es etwas einfacher zu machen, etwa so:

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

Ich konnte jedoch nicht herausfinden, wie dieser „wahre“ Parameter übergeben werden kann, damit er nicht-öffentliche Konstruktoren (intern) akzeptiert.

Habe ich etwas verpasst oder ist es nicht möglich?

War es hilfreich?

Lösung

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

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

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

Andere Tipps

Wenn Sie unbedingt erforderlich, dass der Konstruktor privat sind Sie so etwas wie dies ausprobieren können:

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 GenericFactory als Basisklasse für alle Ihre Fabriken zu verwenden, anstatt jedes von Grund auf richtig zu schreiben?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top