22

System.Type类型包含属性IsGenericTypeDefinitionContainsGenericParameters。阅读 MSDN 文档后,我得出结论,这两个属性的存在是为了检查一个类型是开放的还是封闭的泛型类型。

但是,我看不出两者之间有什么区别,以及何时要使用其中一个。

4

3 回答 3

23

Type.ContainsGenericParameters递归的:

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

这里发生的情况是,它listOfSomeUnknownTypeOfList本身不是泛型类型定义,因为它的类型参数已知是List<T>某个 T 的 a。但是,由于listOfSomeUnknownTypeOfList不完全知道的类型(因为它的类型参数是类型定义)ContainsGenericParameterstrue

于 2012-10-22T13:46:45.740 回答
5

ContainsGenericParameters是 的递归版本IsGenericTypeDefinition

typeof(List<Func<>>).IsGenericTypeDefinition是假的。

于 2012-10-22T13:46:05.757 回答
4

下面有一个表格IsGenericType试图突出一些差异:

IsGenericTypeDefinition属性是真实的。

定义一个泛型类型。通过在表示泛型类型定义的对象上调用MakeGenericType方法Type并指定类型参数数组来创建构造类型。

或者:

ContainsGenericParameters属性是真实的。

示例是具有未分配类型参数的泛型类型、嵌套在泛型类型定义或开放构造类型中的类型,或者具有ContainsGenericParameters属性为 true 的类型参数的泛型类型。

所以它们并不完全相同。

于 2012-10-22T13:48:32.333 回答