Criação de uma instância do tipo Genérico <T> com uma variável contendo o Tipo


85

É possível obter o seguinte código? Eu sei que não funciona, mas estou me perguntando se há uma solução alternativa.

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

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.
Lasse V. Karlsen


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:

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

Não tenho certeza do que você quer dizer com "Índices", é uma variável declarada em outro lugar?
jrh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.