Будет ли GetType() возвращать наиболее производный тип при вызове из базового класса?


будет ли 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 98

3 ответа:

GetType() возвращает фактический, созданный экземпляр типа. В вашем случае, если вы позвоните GetType() на примере B, он вернется typeof(B), даже если рассматриваемая переменная объявлена как ссылка на A.

нет никаких причин для вашего GetSubType() метод.

GetType всегда возвращает тип, который был фактически создан. т. е. наиболее производный тип. Это означает, что ваш GetSubType ведет себя так же, как GetType сам по себе и при этом не нужен.

чтобы статически получить информацию о типе некоторого типа, вы можете использовать typeof(MyClass).

код ошибки: System.Attribute.GetCustomAttributes возвращает Attribute[] не Type.

GetType всегда возвращает фактический тип.

причина этого находится глубоко в.NET framework и CLR, как JIT и CLR использовать .GetType метод для создания объекта типа в памяти, который содержит информацию об объекте, и все доступ к объекту и компиляции через этот экземпляр типа.

для получения дополнительной информации загляните в Книгу "CLR via C#" от Microsoft Press.