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

And*_*rew 1 c# types .net-3.5

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

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

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

那么,originalType上述方法中的值是等于type还是为typeof(System.Type)?我从文档中不太确定.如果originalType是相当于type,这将是一个复制type,这样,如果该GetBaseType方法改变其参数,originalType仍然相当于type原来的形式,不管里面发生了什么GetBaseType

Mot*_*ked 6

1.

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

public new Type GetType()
{
    return base.GetType();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它只调用基类(对象)的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);
Run Code Online (Sandbox Code Playgroud)

如果不知道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