Разница между Type.IsGenericTypeDefinition и Type.ContainsGenericParameters
Тип System.Type
содержит свойства IsGenericTypeDefinition и ContainsGenericParameters. После прочтения документации MSDN я пришел к выводу, что оба свойства существуют для проверки того, является ли тип открытым или закрытым родовым типом.
Однако я не вижу, какая разница между этими двумя, и когда вы хотите использовать один над другим.
Ответы
Ответ 1
Type.ContainsGenericParameters
является рекурсивным:
var genericList = typeof(List<>);
var listOfSomeUnknownTypeOfList = genericList.MakeGenericType(genericList);
listOfSomeUnknownTypeOfList.IsGenericTypeDefinition; // => false
listOfSomeUnknownTypeOfList.ContainsGenericParameters; // => true
Что происходит, так это то, что listOfSomeUnknownTypeOfList
не является общим определением типа, потому что его параметр типа известен как List<T>
для некоторого T. Однако, поскольку тип listOfSomeUnknownTypeOfList
не точно известен (поскольку его type - это определение типа) ContainsGenericParameters
is true
.
Ответ 2
ContainsGenericParameters
является рекурсивной версией IsGenericTypeDefinition
.
typeof(List<Func<>>).IsGenericTypeDefinition
является ложным.
Ответ 3
Существует таблица под IsGenericType
, которая пытается выделить некоторые отличия:
Свойство IsGenericTypeDefinition
имеет значение true.
Определяет общий тип. Созданный тип создается путем вызова метода MakeGenericType
для объекта Type
, который представляет определение общего типа и указание массива аргументов типа.
или
Свойство ContainsGenericParameters
имеет значение true.
Примеры - это общий тип, который имеет параметры неназначенного типа, тип, который вложен в определение общего типа или в открытый построенный тип, или общий тип, который имеет аргумент типа, для которого свойство ContainsGenericParameters
является истинным.
Итак, они не совсем то же самое.