2012-10-22 14 views

risposta

18

Type.ContainsGenericParameters è ricorsiva:

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

cosa succede qui è che listOfSomeUnknownTypeOfList non è una definizione di tipo generico stessa perché il suo parametro tipo è nota per essere un List<T> per qualche T. Tuttavia, poiché il tipo di listOfSomeUnknownTypeOfList non è esattamente noto (perché il suo argomento tipo è una definizione di tipo) ContainsGenericParameters è true.

+1

+1: non lo sapevo mai; p – leppie

5

ContainsGenericParameters è una versione ricorsiva di IsGenericTypeDefinition.

typeof(List<Func<>>).IsGenericTypeDefinition è falso.

+0

+1: non lo sapevo mai, p – leppie

4

C'è un tavolo sotto IsGenericType che cerca di mettere in evidenza alcune differenze:

La proprietà IsGenericTypeDefinition è vero.

Definisce un tipo generico. Viene creato un tipo costruito chiamando il metodo MakeGenericType su un oggetto Type che rappresenta una definizione di tipo generica e che specifica una matrice di argomenti tipo.

o:

Il ContainsGenericParameters proprietà è true.

Esempi sono un tipo generico con parametri di tipo non assegnati, un tipo che è annidato in una definizione di tipo generico o in un tipo di costruzione aperta, o un tipo generico che ha un argomento di tipo per il quale la proprietà ContainsGenericParameters è vero.

Quindi non sono esattamente gli stessi.