2012-02-06 19 views
9

Mi piacerebbe convertire una definizione di tipo generico da System.Type, quindi posso usarla per chiamare metodi generici. Fondamentalmente il retro di typeof.Converti tipo in classe generica Definizione

Esempio (io ho usato "classof" in cui avrei avuto bisogno di una soluzione reale in modo che si vede dove ho avuto un problema, come classof non è un vero e proprio metodo .NET):

public class BaseAppContext { 

    private Type settingsType; 

    public Type SettingsType 
    { 
     get { return this.settingsType; } 
     set { this.SettingsType = value; } 
    }  

    public void MyFunction() { 
     MyStaticClass.GetData<classof(this.SettingsType)>(); 
    } 
} 

Proprio qualche informazione in più perché sto usando questo strano modo per gestire il problema. BaseAppContext è una classe a cui fanno riferimento molte altre classi. Se lo farei generico significherebbe che molte altre parti del codice cambierebbero, cosa che non voglio. Sto scrivendo un framework, quindi mi piacerebbe che il framework inserisse il tipo una volta, e gli sviluppatori possono semplicemente usare le funzioni fornite senza dover gestire il tipo ogni volta che provano a chiamare un metodo.

+0

Questo non ha senso. Cosa saresti in grado di fare con un 'Elenco '? E i vincoli? – SLaks

risposta

3

Questo è fondamentalmente impossibile.
I generici formano tipi in fase di compilazione; non è possibile creare un tipo in fase di compilazione da un tipo noto solo al runtime.

Invece, è necessario utilizzare la riflessione o utilizzare un design diverso (ad esempio, un metodo non generico).

+0

Laks, [questo] (http://stackoverflow.com/questions/31771628/getting-the-dbcontext-dbsets-using-reflection-and-having-a-cast-to-the-proper-ge) sembra correlato, come devo procedere? – Veverke

2

Per raggiungere questo obiettivo, è necessario utilizzare la riflessione:

public void MyFunction() { 
    var method = typeof(MyStaticClass).GetMethod("GetData").MakeGenericMethod(SettingsType); 
    method.Invoke(null, null); 
} 

Tuttavia, non mi consiglia di fare questo e vorrei invece consigliare ridisegnare la vostra soluzione. L'uso della riflessione significa che ti perdi tutta la piacevole sicurezza in fase di compilazione offerta dal linguaggio. Questo generalmente porta a un codice più fragile e meno gestibile.

4

Questo non è possibile, poiché SettingsType è impostato in fase di esecuzione e il codice tra <> è stato compilato.

È possibile creare un'istanza del tipo come questo:

var type = Type.GetType(SettingsType); 
var inst = Activator.CreateInstance(type); 

e gettato inst ad una classe di interfaccia o di base.

Poiché si utilizza una classe statica, la risposta di Rich è migliore.

Problemi correlati