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

时间:2011-04-20 23:35:48

标签: c# reflection

我今天尝试做一些常规测试,并且当我偶然发现某事时,将所有类型都放入程序集中(通过调用Assembly.GetTypes()):

System.RuntimeType:[First.Namespace.FirstClass]

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

System.RuntimeTypeSystem.Type之间有什么区别?

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

4 个答案:

答案 0 :(得分:89)

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

当您尝试获取对象的类型并错误地在表示第一个对象类型的另一个对象上调用GetType()而不是直接使用该对象时,可能会出现混淆。然后Type.ToString()将在调用它的对象表示Type:

时返回"System.RuntimeType"
string str = string.Empty;
Type strType = str.GetType();
Type strTypeType = strType.GetType();
strType.ToString();     // returns "System.string"
strTypeType.ToString(); // returns "System.RuntimeType"

例如,在this blog post中有人试图获取数据库中列的类型,执行以下操作:

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()

答案 1 :(得分:3)

Different between System.Type and System.RuntimeType的答案Thomas Danecker

  

System.Type是一个抽象基类。   CLR有它的具体内容   在内部类型中实现   System.RuntimeType。因为这   typeof(string).GetType()返回一个   RuntimeType但typeof(Type)返回一个   正常类型。使用.Equals方法   实际上是一个object.ReferenceEquals   返回false。得到的   期待结果,你可以使用   type.IsInstanceOfType(元素)。这个   如果元素是,也将返回true   派生类型。如果你想检查   对于确切的类型,返回值   你的方法是假的   结果。你也可以使用   checkType(arrayType中,   Type.GetType(“System.RuntimeType”))来   检查RuntimeType。

答案 2 :(得分:1)

简而言之......

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

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

我现在考虑的方式是System.Type是表示运行时对象类型请求结果的类型的基类型,即System.RuntimeType。因此,当您请求对象的类型时,如"".GetType()System.Type返回的实例是它的后代,System.RuntimeType。事实上,人们应该期望typeof(System.Type).GetType()也应该是System.RuntimeType,但我认为框架特别阻止了这种......对称性。

答案 3 :(得分:0)

看看这个博客,这家伙谈到了差异。在我看来这些类是.NET优化的结果:

http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx