该System.Type
类型包含属性IsGenericTypeDefinition和ContainsGenericParameters。阅读 MSDN 文档后,我得出结论,这两个属性的存在是为了检查一个类型是开放的还是封闭的泛型类型。
但是,我看不出两者之间有什么区别,以及何时要使用其中一个。
该System.Type
类型包含属性IsGenericTypeDefinition和ContainsGenericParameters。阅读 MSDN 文档后,我得出结论,这两个属性的存在是为了检查一个类型是开放的还是封闭的泛型类型。
但是,我看不出两者之间有什么区别,以及何时要使用其中一个。
Type.ContainsGenericParameters
是递归的:
var genericList = typeof(List<>);
var listOfSomeUnknownTypeOfList = genericList.MakeGenericType(genericList);
listOfSomeUnknownTypeOfList.IsGenericTypeDefinition; // => false
listOfSomeUnknownTypeOfList.ContainsGenericParameters; // => true
这里发生的情况是,它listOfSomeUnknownTypeOfList
本身不是泛型类型定义,因为它的类型参数已知是List<T>
某个 T 的 a。但是,由于listOfSomeUnknownTypeOfList
不完全知道的类型(因为它的类型参数是类型定义)ContainsGenericParameters
是true
。
ContainsGenericParameters
是 的递归版本IsGenericTypeDefinition
。
typeof(List<Func<>>).IsGenericTypeDefinition
是假的。
下面有一个表格IsGenericType
试图突出一些差异:
该
IsGenericTypeDefinition
属性是真实的。定义一个泛型类型。通过在表示泛型类型定义的对象上调用
MakeGenericType
方法Type
并指定类型参数数组来创建构造类型。
或者:
该
ContainsGenericParameters
属性是真实的。示例是具有未分配类型参数的泛型类型、嵌套在泛型类型定义或开放构造类型中的类型,或者具有
ContainsGenericParameters
属性为 true 的类型参数的泛型类型。
所以它们并不完全相同。