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

我正在尝试今天进行一些常规testing,并在汇编时(通过调用Assembly.GetTypes() )获取所有types,当我偶然发现某些东西时:

 System.RuntimeType:[First.Namespace.FirstClass] 

每当我尝试比较typeof(FirstClass)types,他们是不相等的。 所以,当我试图find所有包含FirstClasstypes作为generics参数,我没有find任何。

System.RuntimeTypeSystem.Type什么区别?

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

System.RuntimeType是派生自抽象基类System.Type的具体类。 由于System.RuntimeType不是公共的,你通常会遇到System.Type实例。

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

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

例如,在这篇博客文章中,有人正试图获取数据库中某列的types,如下所示:

 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()将返回另一个表示typesSystem.RuntimeTime Type对象,因为这是用于表示原始types对象的具体types。 然后,博客文章显示了一些不必要的reflection技巧,以获取原始types对象的types,实际上所需的全部是:

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

因此,如果您的Type对象报告它代表一个System.RuntimeType ,请确保您没有意外地对您已经获得的types调用GetType()

从Thomas Danecker的 System.Type和System.RuntimeType之间的不同答案:

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

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

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

简单来说…

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

现在我想到的方式是System.Type是表示运行时的对象types请求结果的types的基本types,即System.RuntimeType 。 所以,当你请求一个对象的types时,例如"".GetType() ,返回的System.Type的实例是后代System.RuntimeType 。 事实上,人们应该期望typeof(System.Type).GetType()应该是System.RuntimeType ,但我认为框架明确地阻止了这种…对称性。