Будет ли 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();
}
}
c#
inheritance
polymorphism
Feisty Mango
источник
источник
Ответы:
GetType()
вернет фактический экземпляр типа. В вашем случае, если вы вызываетеGetType()
экземплярB
, он вернетсяtypeof(B)
, даже если соответствующая переменная объявлена как ссылка наA
.Для вашего
GetSubType()
метода нет причин .источник
GetType
всегда возвращает тип, который был фактически создан. т.е. наиболее производный тип. Это означает, что выGetSubType
ведете себя так же, какGetType
и он, и поэтому в этом нет необходимости.Чтобы статически получить информацию о типе некоторого типа, вы можете использовать
typeof(MyClass)
.Однако в вашем коде есть ошибка: не
System.Attribute.GetCustomAttributes
возвращается .Attribute[]
Type
источник
GetType всегда возвращает фактический тип.
Причина этого находится глубоко в .NET framework и CLR , поскольку JIT и CLR используют
.GetType
метод для создания объекта Type в памяти, который содержит информацию об объекте, и весь доступ к объекту и компиляция осуществляется через этот экземпляр Type. ,Дополнительные сведения см. В книге «CLR via C #» от Microsoft Press.
источник