Crear una instancia de tipo genérico <T> con una variable que contenga el tipo


85

¿Es posible lograr el siguiente código? Sé que no funciona, pero me pregunto si existe una solución alternativa.

Type k = typeof(double);
List<k> lst = new List<k>();

Un poco confundido por su comentario "esto se puede lograr en C # 4.0". No puede, al menos no de la forma en que lo demuestra. C # 4 todavía requiere que se especifiquen parámetros de tipo genérico en tiempo de compilación; todavía no puede pasar una variable de tipo como un parámetro de tipo genérico.
— itowlson

1
Exprese las cosas como una pregunta cuando sea una pregunta. El código especificado no se puede lograr con C # 4.0.
— Lasse V. Karlsen


Lo siento por lo de C # 4.0. Quise decir que la respuesta podría usar conceptos en C # 4.0, no necesariamente que el código funcionaría en C # 4.0. Gracias por editar DrJokepu.
— Chris

12
Creo que esta pregunta está perfectamente formulada: ¡la cantidad justa de detalles!
— RunHolt

Respuestas:


119

Sí hay:

var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(typeof(double));
var list = Activator.CreateInstance(specificListType);

Creo que esto es lo que quiero. Déjame comprobarlo y marcaré el tuyo como la respuesta momentáneamente.
— Chris

3
Creo que el problema principal aquí es que no se describa lo que quiere nosotros . Nos muestra un intento fallido de algo y luego pregunta cómo lograr lo que desea . Si quiere respuestas y no conjeturas, debe describir lo que debe hacer, en lugar de cómo intentó hacerlo.
— Lasse V. Karlsen

Básicamente, quiero crear una Lista <> donde el tipo se especifica como una variable Tipo.
— Chris

3
Gracias David M, tu código hace exactamente lo que necesitaba. Lo siento por aquellos que no pudieron responder porque no proporcioné una pregunta adecuada.
— Chris

¿Es posible hacer lo mismo con los métodos genéricos? necesito pasar el tipo dinámico para el método, he publicado mi problema en el siguiente enlace stackoverflow.com/questions/4101784/…
— Mathiyazhagan

3

Una forma más limpia podría ser utilizar un método genérico. Haz algo como esto:

static void AddType<T>()
    where T : DataObject
{
    Indexes.Add(typeof(T), new Dictionary<int, T>());
}

No estoy seguro de lo que quiere decir con "índices", ¿es una variable declarada en otro lugar?
— jrh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.