Будет ли GetType () возвращать наиболее производный тип при вызове из базового класса? - PullRequest
110 голосов
/ 25 апреля 2011

Будет ли 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 ]

124 голосов
/ 25 апреля 2011

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

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

22 голосов
/ 25 апреля 2011

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

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

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

7 голосов
/ 07 августа 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...