GetType () retornará o tipo mais derivado quando chamado da classe base?
Exemplo:
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
}
Ou devo apenas fazer um método abstrato que as classes derivadas terão que implementar como o seguinte?
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
fonte
fonte
Respostas:
GetType()
retornará o tipo instanciado real. No seu caso, se você chamarGetType()
uma instância deB
, ele retornarátypeof(B)
, mesmo se a variável em questão for declarada como uma referência a umA
.Não há razão para o seu
GetSubType()
método.fonte
GetType
sempre retorna o tipo que foi realmente instanciado. ou seja, o tipo mais derivado. Isso significa que vocêGetSubType
se comporta exatamente comoGetType
ele mesmo e, portanto, é desnecessário.Para obter estaticamente as informações de tipo de algum tipo que você pode usar
typeof(MyClass)
.Porém, seu código tem um erro: não
System.Attribute.GetCustomAttributes
retorna .Attribute[]
Type
fonte
GetType sempre retorna o tipo real.
A razão para isso está profundamente na estrutura .NET e CLR , já que o JIT e CLR usam o
.GetType
método para criar um objeto Type na memória que contém as informações sobre o objeto, e todo acesso ao objeto e compilação são feitos por meio dessa instância Type .Para obter mais informações, consulte o livro "CLR via C #" da Microsoft Press.
fonte