Attivatore.CreateInstance(stringa) e Attivatore.CreateInstance<T>() differenza
-
09-06-2019 - |
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?
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