我想知道类型为Type
的on对象实际上是正常类(例如Object
, Int32
等)的类型还是元对象(例如typeof(Object)
, typeof(Int32)
等)的类型。
对象的类型我的意思是:
Type t = typeof(Object);
Console.WriteLine("Type is {0}", t.FullName);
类型为System。对象
和类型对象的类型,即元对象:
Type t = typeof(Object).GetType();
Console.WriteLine("Type is {0}", t.FullName);
类型为System。RuntimeType
我在Type
或TypeInfo
中找不到任何方法/属性来判断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
将返回RuntimeType
,也不是他们实际上继承它…
让我解释一下。我在写一个序列化程序。当序列化类成员(例如字段或属性)时,我将拥有字段类型(而不是对象)。成员完全有可能是Type
类型。我也希望能够序列化这些对象。
例如:
class MyClass {
private Type _cachedType;
}
我将通过反射获得字段_cachedType
的类型。我怎么知道对象是一个Type
摆在首位?
好的,我认为整个问题归结为
如何确定字段的类型为
Type
?
据我所知,您不关心存储在那里的值的实际类型,因为您将以相同的方式序列化它们("然后我可以简单地使用type . assemblyqualifiedname将它们序列化为字符串")。
给你:
bool IsType(Type type)
{
return type == typeof(Type);
}
不需要子类检查。实际对象将属于子类,但字段类型为Type
。
您可以添加子类check:
bool IsType(Type type)
{
return typeof(Type).IsAssignableFrom(type);
}
我想我明白了。我可以用TypeInfo.IsAssignableFrom
bool IsType(Type type)
{
TypeInfo info = typeof(Type).GetTypeInfo();
return info.IsAssignableFrom(type.GetTypeInfo());
}
大致相当于在对象上使用is
操作符,但这种类型是运行时类型