Разница между Type.IsGenericTypeDefinition и Type.ContainsGenericParameters

19

Тип System.Type содержит свойства IsGenericTypeDefinition и ContainsGenericParameters . После прочтения документации MSDN я пришел к выводу, что оба свойства существуют для проверки того, является ли тип открытым или закрытым родовым типом.

Однако я не вижу, какая разница между этими двумя, и когда вы хотите использовать один над другим.

    
задан Steven 22.10.2012 в 15:43
источник

3 ответа

19

Type.ContainsGenericParameters рекурсивный :

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

Что здесь происходит, так это то, что listOfSomeUnknownTypeOfList не является общим определением типа, потому что его параметр типа известен как List<T> для некоторого T. Однако, поскольку тип listOfSomeUnknownTypeOfList не точно известен (поскольку его type является определением типа) ContainsGenericParameters true .

    
ответ дан Jon 22.10.2012 в 15:46
источник
  • +1: Никогда не знал об этом; p –  leppie 22.10.2012 в 15:50
5

ContainsGenericParameters - рекурсивная версия IsGenericTypeDefinition .

typeof(List<Func<>>).IsGenericTypeDefinition - false.

    
ответ дан SLaks 22.10.2012 в 15:46
источник
  • +1: Никогда не знал об этом; p –  leppie 22.10.2012 в 15:49
4

Существует таблица под IsGenericType , которая пытается выделить некоторые различия:

  

Свойство IsGenericTypeDefinition имеет значение true.

     

Определяет общий тип. Созданный тип создается путем вызова метода MakeGenericType объекта Type , который представляет определение общего типа и указание массива аргументов типа.

или

  

Свойство ContainsGenericParameters имеет значение true.

     

Примерами являются общий тип, который имеет параметры неназначенного типа, тип, который вложен в определение общего типа или в открытый построенный тип, или общий тип, который имеет аргумент типа, для которого свойство ContainsGenericParameters является истинным.

Итак, они не совсем то же самое.

    
ответ дан Damien_The_Unbeliever 22.10.2012 в 15:48
источник