2009-08-31 17 views
14

No creo que esto se pueda hacer en C#, pero publicar esto solo para estar seguro. Aquí está mi problema. Me gustaría hacer algo como esto en C#:Tipos genéricos con parámetro de tipo en C#

var x = 10; 
var l = new List<typeof(x)>(); 

o

var x = 10; 
var t = typeof(x); 
var l = new List<t>(); 

Pero por supuesto esto no funciona. Aunque esto no debería ser un problema ya que el tipo t se resuelve en tiempo de compilación. Entiendo que esto se puede resolver con la reflexión, pero como se conocen tipos en tiempo de compilación, usar la reflexión sería excesivo.

+0

es x siempre va a ser de 10 o es sólo una prueba de ¿concepto? Me pregunto si puedes evitar usar la palabra clave var. –

+0

Es solo una prueba de un concepto. Intentaba utilizar este tipo de código para Func <> y Expression <> para eliminar la escritura redundante. Para que el tipo pueda declararse explícitamente:

 int x = 10; var l = new List(); 
Max

Respuesta

41
public static List<T> CreateCompatibleList<T> (T t) 
{ 
    return new List<T>() ; 
} 

var x = 10 ; 
var l = CreateCompatibleList (x) ; 
+0

Agradable. Realmente me gusta esta solución. – Dykam

+1

+1 Sneaky, y funciona para este caso. :) –

+0

¡Muy clevar! Bien hecho. –

3

Definición de los genéricos se hace así en C#:

var someList = new List<int>(); 

Puede no definir los genéricos como esto:

var x = 1; 
var someType = typeof(x); 
var someList = new List<someType>(); 

porque estás especificando el tipo en tiempo de ejecución en este caso , no compilar el tiempo C# no es compatible con eso.

+4

Acaba de repetir lo que Max afirmó en la pregunta. –

+1

@Anton No, no, Max tiene la impresión de que typeof (x) se resuelve en tiempo de compilación, lo que no es correcto. – Joseph

+0

@Joseph: ¿Estás seguro? Sé que x.GetType() se resuelve en tiempo de ejecución, porque da el tipo al que x se refiere actualmente, pero pensé que typeof (x) siempre daría el tipo de la variable, como se definió en tiempo de compilación. –

6

Está tratando de obtener .Net para establecer un tipo genérico utilizando un operador en tiempo de ejecución. Como sabes, eso no funcionará. Los tipos genéricos deben establecerse en tiempo de compilación.

2

No puede hacerlo exactamente cómo se está pidiendo, pero con un poco de reflexión se puede lograr lo mismo

Type genericType = typeof(List<>); 
Type[] type = new Type[] { typeof(int) }; 
Type instanceType = genericType.MakeGenericType(type); 
object instance = Activator.CreateInstance(instanceType); 
var l = (List<int>)instance; 
+2

'(Lista )' en la última línea vence su propósito. Pero sí, esto es útil en ciertos casos. –