System.Type和System.RuntimeType在C#中有什么区别?
我正在尝试今天进行一些常规testing,并在汇编时(通过调用Assembly.GetTypes()
)获取所有types,当我偶然发现某些东西时:
System.RuntimeType:[First.Namespace.FirstClass]
每当我尝试比较typeof(FirstClass)
types,他们是不相等的。 所以,当我试图find所有包含FirstClass
types作为generics参数,我没有find任何。
System.RuntimeType
和System.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
,但我认为框架明确地阻止了这种…对称性。