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