2009-09-03 15 views
14

Actualmente tengo que hacer algo como esto para construir una definición de tipo en tiempo de ejecución para pasarla a mi IOC para su resolución. Simplificado:Build C# Definición de tipo genérico en tiempo de ejecución

Type t = Type.GetType(
"System.Collections.Generic.List`1[[ConsoleApplication2.Program+Person"); 

sé el argumento de tipo genérico de tan sólo el tiempo de ejecución.

¿Hay algo que le permitirá que haga algo como esto (código falso):

Type t = Type.GetTypeWithGenericTypeArguments(
    typeof(List) 
    , passInType.GetType()); 

O debo sólo se adhieren a mi corte, passInType.GetType() Convertir cadena, cadena de la construcción de tipo genérico .. sentir sucia

+14

Me siento sucio solo al leer tu código de muestra. –

Respuesta

34

MakeGenericType - es decir

Type passInType = ... /// perhaps myAssembly.GetType(
     "ConsoleApplication2.Program+Person") 
Type t = typeof(List<>).MakeGenericType(passInType); 

Para un ejemplo completo:

using System; 
using System.Collections.Generic; 
using System.Reflection; 
namespace ConsoleApplication2 { 
class Program { 
    class Person {} 
    static void Main(){ 
     Assembly myAssembly = typeof(Program).Assembly; 
     Type passInType = myAssembly.GetType(
      "ConsoleApplication2.Program+Person"); 
     Type t = typeof(List<>).MakeGenericType(passInType); 
    } 
} 
} 

Como se sugiere en los comentarios - explicar, List<> es el abierta tipo genérico - es decir, "sin ningún tipo específico List<T>T" (para múltiples tipos genéricos, sólo tiene que utilizar comas - es decir, Dictionary<,>). Cuando se especifica T (ya sea por código o vía MakeGenericType) obtenemos el tipo genérico cerrado - por ejemplo, List<int>.

Al utilizar MakeGenericType, cualquier restricción de tipo genérico se sigue imponiendo, pero simplemente en tiempo de ejecución en lugar de en tiempo de compilación.

+0

Puede ser una buena idea agregar la explicación de los tipos genéricos abiertos/cerrados para completar. –

+0

MakeGenericType era exactamente lo que estaba buscando. ¡Gracias! :) Respuesta aceptada –

Cuestiones relacionadas