Будет ли 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();
   }
}

Ответ 1

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

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

Ответ 2

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

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

В вашем коде есть ошибка: System.Attribute.GetCustomAttributes возвращает Attribute[] not Type.

Ответ 3

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

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

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