关于c#:从基类调用时,GetType()是否会返回派生类型最多的类型?

Will GetType() return the most derived type when called from the base class?

当从基类调用时,getType()是否返回最派生的类型?

例子:

1
2
3
4
5
6
7
8
9
10
11
12
public abstract class A
{
    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(this.GetType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them
}

或者我应该做一个抽象的方法,派生类必须像下面那样实现?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public abstract class A
{
    protected abstract Type GetSubType();

    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(GetSubType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them

   protected Type GetSubType()
   {
       return GetType();
   }
}


GetType()将返回实际的实例化类型。在您的例子中,如果您在B的实例上调用GetType(),它将返回typeof(B),即使所讨论的变量声明为对A的引用。

你的GetSubType()方法没有理由。


GetType总是返回实际实例化的类型。即最派生的类型。这意味着你的GetSubType的行为就像GetType本身,因此是不必要的。

要静态获取某种类型的类型信息,可以使用typeof(MyClass)

不过,您的代码有一个错误:System.Attribute.GetCustomAttributes返回Attribute[],而不是Type


GetType始终返回实际类型。

其原因在.NET框架和clr中很深,因为jit和clr使用.GetType方法在内存中创建一个类型对象来保存对象的信息,所有对对象和编译的访问都是通过这个类型实例进行的。

有关更多信息,请参阅微软出版社的书"clr via c"。