Eu gostaria de realizar um teste se um objeto é de um tipo genérico. Eu tentei o seguinte sem sucesso:
public bool Test()
{
List<int> list = new List<int>();
return list.GetType() == typeof(List<>);
}
O que estou fazendo de errado e como faço esse teste?
Suponho que você não queira apenas saber se o tipo é genérico, mas se um objeto é uma instância de um tipo genérico específico, sem conhecer os argumentos de tipo.
Infelizmente, não é muito simples. Não é tão ruim se o tipo genérico for uma classe (como é neste caso), mas é mais difícil para interfaces. Aqui está o código para uma classe:
EDIT: Como observado nos comentários, isso pode funcionar para interfaces:
Eu tenho uma suspeita furtiva de que possa haver alguns casos estranhos em torno disso, mas não consigo encontrar um no qual ele falhe agora.
fonte
List<T>
de uma forma ou de outra. Se você incluir interfaces, é realmente complicado.IsInstanceOfGenericType
por uma chamada para, emIsAssignableFrom
vez de operador de igualdade (==
)?Você pode usar um código mais curto usando a dinâmica, mas isso pode ser mais lento que o reflexo puro:
fonte
Estes são meus dois métodos de extensão favoritos que abrangem a maioria dos casos extremos de verificação de tipo genérico:
Funciona com:
Tem uma sobrecarga que 'expulsa' o tipo genérico específico se retornar verdadeiro (consulte o teste de unidade para obter amostras):
Aqui está um teste para demonstrar a funcionalidade (básica):
fonte
fonte