Domanda

No, questa non è una domanda su farmaci generici.

Ho una Fabbrica modello con diverse classi interne dei costruttori (non li voglio istanziato se non attraverso la fabbrica).

Il mio problema è che CreateInstance non riesce con un "No costruttore senza parametri definiti per questo" oggetto di errore, a meno che io passo "vero" sulla non-pubblico parametro.

Esempio

// Fails
Activator.CreateInstance(type);

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

Volevo fare la fabbrica generico per renderlo un po ' più semplice, come questo:

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

Tuttavia, non sono riuscito a trovare come passare quello "vero" parametro di accettare i non-costruttori pubblici (interno).

Mi sono perso qualcosa o non è possibile?

È stato utile?

Soluzione

Per ovviare a questo, si poteva solo modificare il vostro utilizzo in quanto tale:

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

Il metodo factory sarà ancora generico, ma la chiamata per l'attivatore non utilizzare l'overload generico.Ma si dovrebbe comunque ottenere gli stessi risultati.

Altri suggerimenti

Se è assolutamente necessario che il costruttore privato, si può provare qualcosa di simile a questo:

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

Altrimenti si sta meglio fuori dall'aggiunta di un nuovo vincolo e che andando via:

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

Si sta tentando di utilizzare GenericFactory come classe base per tutte le vostre fabbriche piuttosto che scrivere ogni da zero giusto?

oltre Attivatore.CreateInstance(typeof(T), true) per lavoro, T dovrebbe avere costruttore di default

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top