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

118

Будет ли 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();
   }
}
Feisty Mango
источник
10
хорошо - ты пробовал?
BrokenGlass
2
@BrokenGlass обычно я бы просто сделал это, но я не за компьютером ... просто использовал свой телефон, чтобы сделать сообщение, потому что решение проблемы начало формироваться, и мне было любопытно узнать сейчас! = P
Feisty Mango

Ответы:

133

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

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

Рид Копси
источник
Но есть ли это? Я передаю экземпляр объекта из его (абстрактного) суперкласса, получатель видит только суперкласс. Разве это не значит, что он всегда будет возвращать то, что дескриптор был определен как не экземпляр? - или я что-то упустил?
Ага .. разница в использовании TypeOf (X) и x.GetType (), я думаю
22

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

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

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

CodesInChaos
источник
7

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

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

Дополнительные сведения см. В книге «CLR via C #» от Microsoft Press.

Йоэль Халб
источник