我今天试图做一些约定测试,并在一个程序集中获得所有类型(通过调用Assembly.GetTypes()
),当我偶然发现一些东西:
System.RuntimeType:[First.Namespace.FirstClass]
当我尝试将该类型与typeof(FirstClass)
进行比较时,它们是不相等的。因此,当我试图找到包含FirstClass
作为泛型参数的所有类型时,我没有找到任何。
System.RuntimeType
和System.Type
的区别是什么?
System.RuntimeType
是一个派生自抽象基类System.Type
的具体类。由于System.RuntimeType
不是公共的,所以您通常会遇到System.Type
的实例。
当您试图获取对象的类型并错误地在表示第一个对象类型的另一个对象上调用GetType()
,而不是直接使用该对象时,可能会出现混淆。然后Type.ToString()
将返回"System.RuntimeType"
当它被调用的对象表示一个类型:
string str = string.Empty;
Type strType = str.GetType();
Type strTypeType = strType.GetType();
strType.ToString(); // returns "System.string"
strTypeType.ToString(); // returns "System.RuntimeType"
例如,在这篇博客文章中,有人试图获得数据库中列的类型,做这样的事情:
object val = reader.GetFieldType(index);
Type runtimeType = val.GetType();
PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType");
Type type = (Type)propInfo.GetValue(val, null);
由于val已经是一个Type对象,val. gettype()将返回另一个代表类型System.RuntimeTime
的Type对象,因为这是用来表示原始类型对象的具体类型。这篇博文随后展示了一些不必要的反射技巧,以获得原始类型对象的类型,而实际上所需要的只是:
Type type = reader.GetFieldType(index) as Type;
所以如果你的Type
对象报告它代表一个System.RuntimeType
,确保你没有意外地调用GetType()
在一个类型,你已经得到
从答案到系统之间的差异。类型和系统。RuntimeType:
系统。Type是一个抽象基类。CLR是具体的内部类型的实现System.RuntimeType。正因为如此typeof(string).GetType()返回一个但是typeof(Type)返回a正常的类型。使用。equals方法实际上是一个物体。ReferenceEquals返回false。为了得到期待结果,你可以使用type.IsInstanceOfType(元素)。这也会返回true如果元素是派生类型。如果你想查一下的话对于确切的类型,返回值你的方法是错误的结果。你也可以使用checkType (arrayTypeType.GetType("System.RuntimeType"))检查RuntimeType
总之…
"".GetType().ToString() == "System.String"
"".GetType().GetType().ToString() == "System.RuntimeType"
我现在认为System.Type
是在运行时表示对象类型请求结果的类型的基类型,即System.RuntimeType
。因此,当您请求对象的类型(如"".GetType()
)时,返回的System.Type
实例是它的后代System.RuntimeType
。事实上,人们应该期望typeof(System.Type).GetType()
也应该是System.RuntimeType
,但我认为框架特别防止这种……对称。