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