Um pouco confuso com seu comentário "isso pode ser feito em C # 4.0." Não pode, pelo menos não da maneira que você mostra. C # 4 ainda requer que parâmetros de tipo genérico sejam especificados em tempo de compilação; você ainda não pode passar uma variável de tipo como um parâmetro de tipo genérico.
itowlson
1
Por favor, expresse as coisas como uma pergunta quando for uma pergunta. O código conforme especificado não pode ser executado com C # 4.0.
Desculpe pela coisa do C # 4.0. Eu quis dizer que a resposta poderia usar conceitos em C # 4.0, não necessariamente que o código funcionaria em C # 4.0. Obrigado pela edição DrJokepu.
Chris
12
Acho que essa pergunta foi formulada perfeitamente - com a quantidade certa de detalhes!
RunHolt
Respostas:
119
Sim existe:
var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(typeof(double));
var list = Activator.CreateInstance(specificListType);
Acho que é isso que eu quero. Deixe-me verificar e marcarei a sua como a resposta momentaneamente.
Chris
3
Acho que o principal problema aqui é que você não descreve o que deseja para nós . Você nos mostra uma tentativa fracassada de algo e, em seguida, pergunta como realizar o que deseja . Se você quer respostas, e não suposições, deve descrever o que precisa fazer, em vez de como tentou fazer.
Lasse V. Karlsen
Eu basicamente quero criar uma List <> onde o tipo é especificado como uma variável Type.
Chris
3
Obrigado David M, seu código faz exatamente o que eu precisava. Lamento aqueles que não puderam responder porque eu não fiz uma pergunta adequada.
Chris
é possível fazer o mesmo para métodos genéricos? eu preciso passar o tipo dinâmico para o método, postei meu problema no link abaixo stackoverflow.com/questions/4101784/…
Mathiyazhagan
3
Uma maneira mais limpa pode ser usar um método genérico. Faça algo assim:
staticvoidAddType<T>()
where T : DataObject
{
Indexes.Add(typeof(T), new Dictionary<int, T>());
}
Respostas:
Sim existe:
var genericListType = typeof(List<>); var specificListType = genericListType.MakeGenericType(typeof(double)); var list = Activator.CreateInstance(specificListType);
fonte
Uma maneira mais limpa pode ser usar um método genérico. Faça algo assim:
static void AddType<T>() where T : DataObject { Indexes.Add(typeof(T), new Dictionary<int, T>()); }
fonte