GetType()对Type的实例返回什么?

本文关键字:实例 返回 什么 Type GetType | 更新日期: 2023-09-27 18:13:05

我在调试时碰到了这段代码。

private bool HasBaseType(Type type, out Type baseType)
{
    Type originalType = type.GetType();
    baseType = GetBaseType(type);
    return baseType != originalType;
}

我最初的想法是,方法的第一行中的type.GetType()总是产生等同于typeof(System.Type)的结果,这在上下文中对我来说似乎毫无意义。然而,MSDN建议Type覆盖从Object继承的GetType()版本。然后,非静态Type.GetType()(不要与三个静态版本混淆)上的实际MSDN页面说GetType()方法返回"当前类型"。没有给出进一步的相关解释。

那么,上面方法中originalType的值是等于type还是等于typeof(System.Type)呢?从文件中我不太确定。如果originalType等价于type,那么它是否就是type拷贝,这样,如果GetBaseType方法改变了它的参数,那么无论GetBaseType内部发生了什么变化,originalType仍然等价于type的原始形式?

GetType()对Type的实例返回什么?

1.

GetType没有被定义为virtual,因此不能被重写。系统。Type不会覆盖对象的GetType,它会隐藏它(在c#中,它会用new关键字表示)。如果您使用ILSpy这样的反汇编工具,您将看到它的实现如下:

public new Type GetType()
{
    return base.GetType();
}

正如您所看到的,它只调用基类(即对象)的GetType实现,因此最终结果是相同的。这个版本的GetType提供了_Type接口的正式实现。您通常不必担心这个接口,它的存在是出于互操作性的原因。

2。

GetType方法定义在object中并返回System.Type。但是仔细看看系统。类型表明它被定义为抽象,因此它永远不能被实例化。从GetType获取具体东西的方法是获取另一个类型,它派生自system。type。实际上我们得到的是System的一个实例。RuntimeType,它派生自System.Type。

这样做的原因是必须只有一个实例表示给定的类型。也就是说,不管在多少个不同的字符串实例(例如)上调用GetType,您仍然会得到完全相同的实例,因为只有一个实例描述字符串。为了确保只有一个实例,System。类型被定义为抽象,因此不能由用户代码和系统实例化。RuntimeType被定义为内部的,所以它只能被mscorlib中的代码访问,也不能被用户代码实例化。

3。

系统的存在性。在大多数情况下,RuntimeType是一个可能被忽略的实现细节。无论出于何种目的,代码都可以假设GetType返回System.Type的一个实例。唯一的例外是以下代码(您可以用任何其他类型替换string):

bool b = 
    typeof(string).GetType() == typeof(Type);

如果不知道系统。我们会假设b为真因为我们假设GetType返回System。类型,它显然是右边表达式的值。但是由于左边的值实际上是System。RuntimeType, b为false。类型和系统。RuntimeType是两种不同的类型,因此不相等)。这是您需要了解System的唯一情况。rununtimetype,以了解代码的行为方式。在任何其他情况下,GetType返回System都无关紧要。你可以忽略它

4。

这是我的。net在线课程中讨论运行时类型信息(RTTI)部分的直接链接。我没有提到系统。RuntimeType,因为就像我说的,它是一个实现细节,大多数情况下可以忽略。但是这个链接会让你对System.Type有更多的背景知识和更清晰的理解。

http://motti.me/tw

我希望这对你有帮助!

Motti

Type实例的类型为System.RuntimeType

    {
        Console.WriteLine(typeof(System.Type).GetType());
        Console.WriteLine(typeof(string).GetType().GetType());
        Console.WriteLine(typeof(int).GetType());
        Console.WriteLine(typeof(List<int>).GetType());
    }
System.RuntimeType 
System.RuntimeType 
System.RuntimeType 
System.RuntimeType

看起来两者都不是。当你在Type实例上调用GetType时,它似乎总是返回RuntimeType

我通过运行以下代码片段对System程序集进行检查:

Assembly
  .GetAssembly(typeof(int))
  .GetTypes()
  .Where(type => type.GetType() == type)

Edit:正如Luke在评论中澄清的那样,"原始类型"实际上只是给定RuntimeType时的原始类型-它不适用于其他任何东西。由于该类型是系统内部的,因此该方法似乎完全错误。