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.