我正在研究一种使用反射来检查方法的参数类型的方法。此方法遍历 ParameterInfo 并使用这些参数的类型执行某些操作。
我一直假设如果 TypeInfo.IsClass
为 true
,则此类型是一个类并且始终(间接)派生自类型 object
(当然,当类型是 object
本身时除外)。因此,如果 TypeInfo.IsClass
为真,则必须设置 TypeInfo.BaseType
。
好吧,我的假设是错误的!有些类不是从 object
类型派生的。我的假设搞砸了我的代码。
例如:
Type type = typeof(int).MakeByRefType();
type.IsClass
将为 true
并且 type.BaseType
将为 null
。
如果你仔细想想,这是合乎逻辑的。我可以通过检查 TypeInfo.IsByRef
来防止我的代码崩溃。
现在我的问题是:是否有更多这样的“奇特”类型(除了 ByRef 类型和类型 object
),它们是一个类 (IsClass == true
) 但没有基类型 (BaseType == null
)?
在您回答之前:我仅指的是 IsClass == true
的类型!我的 int
类型示例只是一个示例。它可以是任何类型。
所以请不要:
- 接口(interface)
- 结构
- 无效
到目前为止的答案:
- ByRef 类型 (
T&
):如问题中所述。 - 指针类型 (
T*
):由 Mark Gravell 发现。
最佳答案
我会说 IsClass
在这里只是误导。它指出:
Gets a value indicating whether the System.Type is a class; that is, not a value type or interface.
它是这样实现的:它检查标志是否包含Interface
,以及它是否是ValueType
。
不幸的是,还有比这更多的东西。指针不是托管类型。 by-ref 与指针非常相似。指针不是 object
,尽管在通常使用中,强制转换实际上是取消引用/强制转换。这同样适用于诸如 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 - 并列出了一些其他示例(例如,开放泛型类型)。
关于c# - 类不继承自对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16461524/