2012-02-06 25 views
9

Me gustaría convertir un System.Type a la definición de tipo genérico, así que puedo usarlo para llamar a métodos genéricos. Básicamente, al revés de typeof.Convertir tipo a clase genérica Definición

Ejemplo (i utiliza "classof", donde iba a necesitar la solución real para que pueda ver donde tengo un problema, ya que classof no es un método .NET real):

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)>(); 
    } 
} 

Sólo algo más de información por qué estoy usando esta extraña forma de manejar el problema. BaseAppContext es una clase a la que se refieren muchas otras clases. Si lo hiciera Genérico, eso significaría que muchas otras partes del código cambiarían, lo que no quiero. Estoy escribiendo un marco, por lo que me gustaría que el marco ingrese el tipo una vez, y los desarrolladores pueden usar las funciones proporcionadas sin tener que lidiar con el tipo cada vez que intentan llamar a un método.

+0

Eso no tiene sentido. ¿Qué podría hacer con una 'List '? ¿Qué hay de las restricciones? – SLaks

Respuesta

3

Esto es fundamentalmente imposible.
genéricos forman tipos de tiempo de compilación; no puede crear un tipo de tiempo de compilación a partir de un tipo conocido solo en tiempo de ejecución.

En su lugar, debe utilizar la reflexión o utilizar un diseño diferente (por ejemplo, un método no genérico).

+0

Laks, [este] (http://stackoverflow.com/questions/31771628/getting-the-dbcontext-dbsets-using-reflection-and-having-a-cast-to-the-proper-ge) parece relacionado, Cómo debo proceder ? – Veverke

2

Para lograrlo, tendrá que utilizar la reflexión:

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

Sin embargo, yo no recomendaría hacer esto y en su lugar aconsejar el rediseño de su solución. Usar el reflejo significa que se pierde toda la encantadora seguridad de tiempo de compilación que proporciona el lenguaje. Esto generalmente conduce a un código más frágil y menos sostenible.

4

Esto no será posible, ya que SettingsType se establece en tiempo de ejecución y se compila el código entre <>.

Puede crear una instancia de su tipo de la siguiente manera:

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

y echó inst a una clase de interfaz o base.

Dado que está utilizando una clase estática, la respuesta de Rich es mejor.

Cuestiones relacionadas