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

时间:2011-04-25 16:37:35

标签: c# inheritance polymorphism

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

示例:

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
}

或者我应该创建一个派生类必须实现的抽象方法,如下所示?

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();
   }
}

3 个答案:

答案 0 :(得分:122)

GetType()将返回实际的实例化类型。在您的情况下,如果您在GetType()的实例上致电B,则会返回typeof(B),即使相关变量被声明为对A的引用。

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

答案 1 :(得分:22)

GetType始终返回实际实例化的类型。即最衍生的类型。这意味着您的GetSubType行为就像GetType本身一样,因此是不必要的。

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

您的代码有误:System.Attribute.GetCustomAttributes返回Attribute[]而不是Type

答案 2 :(得分:7)

GetType始终返回实际类型。

它的原因在于.NET框架和CLR,因为JIT和CLR使用.GetType方法在内存中创建一个Type对象来保存关于对象,以及对对象和编译的所有访问都是通过此Type实例进行的。

有关详细信息,请参阅Microsoft Press的“CLR via C#”一书。