C#中的System.Type和System.RuntimeType有什么区别?


89

我今天尝试进行一些常规测试,并Assembly.GetTypes()偶然发现某些东西时,通过调用来获取程序集中的所有类型:

System.RuntimeType:[First.Namespace.FirstClass]

每当我尝试将该类型与进行比较时typeof(FirstClass),它们都不相等。因此,当我尝试查找包含FirstClass为通用参数的所有类型时,没有找到任何类型。

System.RuntimeType和之间有什么区别System.Type

有什么办法可以解决我的问题?


6
您可以提供一个小程序来演示您遇到的问题吗?
埃里克·利珀特

我原打算去,但已经得到答案了:P
Edgar Gonzalez

Answers:


108

System.RuntimeType是从抽象基类派生的具体类System.Type。由于System.RuntimeType不是公开的,因此您通常会遇到的实例System.Type

当您尝试获取对象的类型并错误地调用GetType()表示第一个对象类型的另一个对象时,可能会产生混乱,而不仅仅是直接使用该对象。然后,当调用该对象的对象表示Type时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()将返回另一个表示该类型的Type对象,System.RuntimeTime因为这是用于表示原始类型对象的具体类型。然后,该博客文章显示了一些不必要的反射技巧,以获取原始类型对象的类型,而实际上所需要做的只是:

Type type = reader.GetFieldType(index) as Type;

因此,如果您的Type对象报告它表示一个System.RuntimeType,请确保您没有意外调用GetType()您已经拥有的类型。


第一个代码段仅检查对象是否为的实例,Type即使您通过也会返回true typeof(int)。第二个代码段不适用于比较typeof(string).GetType()typeof(Type)
马克·西达德

这正是我想要的!我确实找到了Thomas Danecker的帖子,但没有找到Doogal Bell的帖子
Edgar Gonzalez,

1
@马克·西达德 发现得很好,谢谢。有固定的答案会更有帮助,希望能消除我通过引用该博客文章而引起的任何困惑。
Ergwun 2011年

@埃德加·冈萨雷斯(Edgar Gonzalez):我所引用的博客帖子实际上颇具误导性。请查看我更新的答案以获取更多信息。
Ergwun 2011年

4

从答案的System.Type和System.RuntimeType之间不同托马斯Danecker

System.Type是一个抽象基类。CLR在内部类型System.RuntimeType中有其具体实现。由于这种typeof(string).GetType()返回RuntimeType,但typeof(Type)返回常规Type。实际上,使用.Equals方法会生成一个object.ReferenceEquals,该对象返回false。为了获得预期的结果,您可以使用type.IsInstanceOfType(element)。如果element是派生类型,则也将返回true。如果要检查确切的类型,则需要返回方法false的返回值。您也可以使用checkType(arrayType,Type.GetType(“ System.RuntimeType”))检查RuntimeType。


1
“确实是”-我们可以进行语法更正吗?这就像整个事情的症结所在,没有任何意义。
N73k

2

简单来说...

    "".GetType().ToString()           == "System.String"

    "".GetType().GetType().ToString() == "System.RuntimeType"

我现在考虑的方式是System.Type代表运行时对象类型请求结果的类型的基本类型System.RuntimeType。因此,当您请求对象的类型(如中)时,return"".GetType()的实例System.Type是它的后代System.RuntimeType。实际上,人们应该期望的也typeof(System.Type).GetType()应该如此System.RuntimeType,但是我认为该框架专门防止了这种……对称性。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.