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.
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:
staticvoidAddType<T>()
where T : DataObject
{
Indexes.Add(typeof(T), new Dictionary<int, T>());
}
Respuestas:
Sí hay:
var genericListType = typeof(List<>); var specificListType = genericListType.MakeGenericType(typeof(double)); var list = Activator.CreateInstance(specificListType);
fuente
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>()); }
fuente