Diferença entre Type.IsGenericTypeDefinition e Type.ContainsGenericParameters

O tipo System.Type contém as propriedades IsGenericTypeDefinition e ContainsGenericParameters . Depois de ler a documentação do MSDN, concluo que ambas as propriedades existem para verificar se um tipo é um tipo genérico aberto ou fechado.

No entanto, não consigo ver qual é a diferença entre os dois e quando você quer usar um sobre o outro.

Type.ContainsGenericParameters é recursivo :

 var genericList = typeof(List<>); var listOfSomeUnknownTypeOfList = genericList.MakeGenericType(genericList); listOfSomeUnknownTypeOfList.IsGenericTypeDefinition; // => false listOfSomeUnknownTypeOfList.ContainsGenericParameters; // => true 

O que acontece aqui é que listOfSomeUnknownTypeOfList não é uma definição de tipo genérica porque seu parâmetro type é conhecido por ser um List para alguns T. No entanto, como o tipo de listOfSomeUnknownTypeOfList não é exatamente conhecido (porque seu tipo é um tipo de definição) ) ContainsGenericParameters é true .

ContainsGenericParameters é uma versão recursiva do IsGenericTypeDefinition .

typeof(List>).IsGenericTypeDefinition é falso.

Existe uma tabela sob IsGenericType que tenta destacar algumas diferenças:

A propriedade IsGenericTypeDefinition é verdadeira.

Define um tipo genérico. Um tipo construído é criado chamando o método MakeGenericType em um object Type que representa uma definição de tipo genérico e especificando uma matriz de argumentos de tipo.

ou:

A propriedade ContainsGenericParameters é verdadeira.

Exemplos são um tipo genérico que possui parâmetros de tipo não atribuídos, um tipo nested em uma definição de tipo genérico ou em um tipo construído aberto ou um tipo genérico que possui um argumento de tipo para o qual a propriedade ContainsGenericParameters é true.

Então eles não são exatamente os mesmos.