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

时间:2011-11-02 23:51:20

标签: c# .net-3.5 types

我在调试过程中遇到了这段代码。

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

我最初的想法是,方法第一行中的type.GetType()总是会产生等价的typeof(System.Type),这对我来说在上下文中看起来毫无意义。但是,Type GetType()会覆盖将从Object继承的GetType()版本。然后,MSDN suggests(不要与三个静态版本混淆)说originalType方法返回“当前类型”。没有给出进一步的相关解释。

那么,上述方法中type的值是否等于typeof(System.Type)originalType?我从文档中不太确定。如果type等同于type,那么它是GetBaseType副本,这样,如果originalType方法改变其参数,{{无论type内发生什么,1}}仍然等同于原始形式的GetBaseType

3 个答案:

答案 0 :(得分:6)

1

GetType未定义为虚拟,因此无法覆盖。 System.Type不会覆盖对象的GetType,它会隐藏它(在C#中它将用new关键字表示)。如果您使用反汇编工具(如ILSpy),您将看到它的实现方式如下:

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

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

2

GetType方法在object中定义并返回System.Type。但仔细观察System.Type会发现它被定义为抽象,因此它永远无法实例化。因此,从GetType获取具体内容的方法是获取另一种类型,该类型派生自System.Type。实际上我们得到的是System.RuntimeType的一个实例,它派生自System.Type。

原因是必须只有一个实例代表给定的类型。也就是说,调用GetType的字符串有多少不同(例如),你仍然可以获得完全相同的实例,因为只有一个实例描述了一个字符串。为了确保只有一个实例,System.Type被定义为抽象,因此无法通过用户代码实例化,System.RuntimeType被定义为内部,因此只能访问mscorlib中的代码,并且无法通过用户代码实例化。

3

System.RuntimeType的存在是一个实现细节,在大多数情况下可能会被忽略。对于所有意图和目的,您的代码可以假定GetType返回System.Type的实例。 唯一的例外是使用以下代码(您可以将字符串替换为任何其他类型):

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

如果不知道System.RuntimeType,可以假设b为真,因为假设GetType返回System.Type,这显然是右手表达式的值。但由于左手值实际上是System.RuntimeType,因此b为false(System.Type和System.RuntimeType是两种不同的类型,因此不相等)。这是您需要了解System.RuntimeType以了解代码行为的原因的唯一情况。在任何其他情况下,GetType返回System.RuntimeType并不重要,您可以忽略它。

4

这是我的.NET在线课程中讨论运行时类型信息(RTTI)的直接链接。我没有提到System.RuntimeType,因为就像我说的那样,它实际上可以被忽略。但是这个链接将为您提供更多背景和更清楚地了解System.Type。

http://motti.me/tw

我希望这有帮助!

Motti

答案 1 :(得分:3)

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

答案 2 :(得分:2)

看起来两者都没有。当您在GetType个实例上致电Type时,它似乎总是返回RuntimeType

我通过运行此代码片段对系统程序集进行了检查:

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

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