我总是假设如果TypeInfo.IsClass为true,那么这个类型是一个类,并且始终从类型对象派生(间接)(除非当类型是对象本身时).因此,如果TypeInfo.IsClass为true,则必须设置TypeInfo.BaseType.
那我的假设是错的!有类不能从类型对象派生.我的假设搞砸了我的代码.
例如:
Type type = typeof(int).MakeByRefType();
type.IsClass将为true,type.BaseType将为null.
如果你考虑,这是合乎逻辑的.我可以通过检查TypeInfo.IsByRef来防止我的代码崩溃.
现在我的问题是:是否有更多这样的“异国情调”类型(包括ByRef类型和类型对象),它们是一个类(IsClass == true),但没有基类型(BaseType == null)?
在你回答之前:我只是引用IsClass == true的类型!而我的int类型的例子只是一个例子.它可能是任何类型.
所以请不要:
>接口
>结构
>空虚
答案到目前为止
> ByRef类型(T&):作为问题中的描述.
>指针类型(T *):由Mark Gravell发现.
解决方法
Gets a value indicating whether the System.Type is a class; that is,not a value type or interface.
它以这种方式实现:它检查标志是否包括Interface,以及它是否是ValueType.
不幸的是,这里有更多的东西.指针不是管理类型. by-ref与指针非常相似.指针不是对象,尽管通常使用该转换实际上是一个取消引用/转换.同样适用于诸如直接指针(如int *)的东西.
不是.NET中的一切都是对象:)
var baseType = typeof(int*).BaseType; // null bool liesAndMoreLies = typeof(int*).IsClass; // true
Eric Lippert covers this more here: Not everything derives from object – 并列出了一些其他例子(例如打开通用类型).