所有 Type 类 都继承自 RuntimeType 吗?

Do all Type classes inherit from RuntimeType?

我想知道 Type 类型的 on 对象是否实际上是普通 class 的类型(例如 ObjectInt32 等)或元对象的类型(例如 typeof(Object)typeof(Int32) 等)。

对象的类型我的意思是:

Type t = typeof(Object);
Console.WriteLine("Type is {0}", t.FullName);

Type is System.Object

并通过类型对象,即元对象:

Type t = typeof(Object).GetType();
Console.WriteLine("Type is {0}", t.FullName);

Type is System.RuntimeType

我在 TypeTypeInfo 中找不到任何 method/property 来判断创建 Type 对象的对象是否实际上是 Type 而不是普通对象。

如果我有对象,我可以这样做:

bool IsType(object o) { return o is Type; }

但是,我没有对象本身,只有它的类型。

我希望得到一些类似的东西:

bool IsType(Type t) { return t.GetTypeInfo().IsType; }

但似乎没有什么比这更好的了..

所以目前我唯一能想到的是:

bool IsType(Type type)
{
    // Can't use typeof(RuntimeType) due to its protection level
    Type runtimeType = typeof(Object).GetType();
    return runtimeType.Equals(type);
}

然而,我不能确定 GetType() 对于类型 Type 的所有对象是否会 return RuntimeType,也不能确定它们是否真的继承自它。 .

更新

让我解释一下。我正在写一个序列化程序。序列化 class 成员(例如字段或 属性)时,我将拥有字段类型(但不是对象)。该成员完全有可能属于 Type 类型。我也希望能够序列化这些对象。

例如 class 像这样:

class MyClass {
    private Type _cachedType;
}

我会通过反射得到字段_cachedType的类型。我怎么知道该对象首先是 Type

我想我明白了。我可以使用 TypeInfo.IsAssignableFrom.

bool IsType(Type type)
{
    TypeInfo info = typeof(Type).GetTypeInfo();
    return info.IsAssignableFrom(type.GetTypeInfo());
}

这大致相当于在对象上使用 is 运算符,但此类型是运行时类型。

好的,我认为整个问题都简化为

How can I determine that a field is of type Type?

据我所知,您不必关心存储在那里的值的实际类型,因为您将以相同的方式序列化所有这些值 ("then I can simply serialize them as strings using Type.AssemblyQualifiedName")。

给你:

bool IsType(Type type)
{
    return type == typeof(Type);
}

无需子类检查。实际对象将属于子类,但该字段的类型为 Type.

如果您愿意,您可以添加子类检查:

bool IsType(Type type)
{
    return typeof(Type).IsAssignableFrom(type);
}