所有 Type 类 都继承自 RuntimeType 吗?
Do all Type classes inherit from RuntimeType?
我想知道 Type
类型的 on 对象是否实际上是普通 class 的类型(例如 Object
、Int32
等)或元对象的类型(例如 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
我在 Type
或 TypeInfo
中找不到任何 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);
}
我想知道 Type
类型的 on 对象是否实际上是普通 class 的类型(例如 Object
、Int32
等)或元对象的类型(例如 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
我在 Type
或 TypeInfo
中找不到任何 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);
}