GetType () retornará o tipo mais derivado quando chamado da classe base?

118

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();
   }
}
Feisty Mango
fonte
10
bem - você experimentou?
BrokenGlass,
2
@BrokenGlass normalmente faria isso mas não estou no computador ... só usei meu celular para fazer o post porque estava começando a se formar uma solução para um problema e estava curioso para saber agora! = P
Feisty Mango

Respostas:

133

GetType()retornará o tipo instanciado real. No seu caso, se você chamar GetType()uma instância de B, ele retornará typeof(B), mesmo se a variável em questão for declarada como uma referência a um A.

Não há razão para o seu GetSubType()método.

Reed Copsey
fonte
É verdade? Estou passando uma instância de um objeto de sua superclasse (abstrata), o receptor só vê a superclasse. Não é que ele sempre retornará o que o identificador foi definido como não a instância? - Ou eu estou esquecendo de alguma coisa?
Ah ha .. a diferença é usar TypeOf (X) vs. x.GetType () eu acho
22

GetTypesempre retorna o tipo que foi realmente instanciado. ou seja, o tipo mais derivado. Isso significa que você GetSubTypese comporta exatamente como GetTypeele 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.GetCustomAttributesretorna .Attribute[]Type

CodesInChaos
fonte
7

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 .GetTypemé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.

Yoel Halb
fonte