Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';C#中System.Type和System.RuntimeType的区别是什么?_C#_Reflection - Fatal编程技术网

什么';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错误!找不到那个页面”。