什么';C#中System.Type和System.RuntimeType的区别是什么?
今天我试图做一些约定测试,并获取程序集中的所有类型(通过调用什么';C#中System.Type和System.RuntimeType的区别是什么?,c#,reflection,C#,Reflection,今天我试图做一些约定测试,并获取程序集中的所有类型(通过调用assembly.GetTypes()),这时我偶然发现了一些东西: System.RuntimeType:[First.Namespace.FirstClass] 每当我尝试将该类型与typeof(FirstClass)进行比较时,它们并不相等。因此,当我试图查找所有包含FirstClass作为泛型参数的类型时,我找不到任何类型 System.RuntimeType和System.Type之间有什么区别 有什么方法可以解决我的问题吗
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已经是一个类型对象,val.GetType()将返回另一个表示类型的类型对象System.RuntimeTime
,因为这是用于表示原始类型对象的具体类型。然后,博客文章展示了一些不必要的反射技巧,以获取原始类型对象的类型,而实际上所需的只是:
Type type = reader.GetFieldType(index) as Type;
因此,如果您的类型
对象报告它表示一个系统.RuntimeType
,请确保您没有意外地对您已经得到的类型调用GetType()
。从以下答案:
Type是一个抽象基类。
CLR有它的混凝土
内部类型中的实现
System.RuntimeType。因此
GetType()返回一个
RuntimeType但typeof(Type)返回
正常型。使用.Equals方法
实际上,object.ReferenceEquals
返回false。得到
预期结果,您可以使用
类型。IsInstanceOfType(元素)。这
如果元素为,则也将返回true
派生类型。如果你想查查的话
对于确切的类型,返回值
你的方法是错误的
结果。您也可以使用
检查类型(arrayType,
Type.GetType(“System.RuntimeType”))到
检查RuntimeType
看看这篇博客,这家伙谈到了差异。在我看来,这些类是.NET优化的结果: 简而言之
"".GetType().ToString() == "System.String"
"".GetType().GetType().ToString() == "System.RuntimeType"
我现在认为,
System.Type
是表示运行时对象类型请求结果的类型的基本类型,即System.RuntimeType
。因此,当您请求对象的类型时,如在中所示,“”.GetType()
,返回的System.type
实例是它的后代,System.RuntimeType
。事实上,我们应该期望typeof(System.Type).GetType()
也应该是System.RuntimeType
,但我认为框架特别防止了这种对称性。你能提供一个小程序来演示你遇到的问题吗?我想,但是已经得到了答案:p第一个代码片段只检查对象是否是类型的实例
——即使传递类型(int)
,它也会返回true。第二个代码段不适用于比较typeof(string).GetType()
和typeof(Type)
。这正是我要找的!我找到了Thomas Danecker的帖子但没有找到Doogal Bell的s@Mark西达德。很好,谢谢。我已经找到了更有用的答案,希望通过引用那篇博文来澄清我引入的任何困惑。@Edgar Gonzalez:我引用的那篇博文实际上是误导性的。请看我更新的答案,以获得更好的信息。“事实上是一个”-我们可以得到一个语法更正。这就像是整件事的症结所在,毫无意义。答案中的链接是死的——“哦,404错误!找不到那个页面”。