Czy GetType () zwróci najbardziej pochodny typ, gdy zostanie wywołany z klasy bazowej?

118

Czy GetType () zwróci najbardziej pochodny typ, gdy zostanie wywołany z klasy bazowej?

Przykład:

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
}

Czy powinienem po prostu utworzyć metodę abstrakcyjną, którą klasy pochodne będą musiały zaimplementować, jak poniżej?

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();
   }
}
Zadziorna Mango
źródło
10
cóż - wypróbowałeś to?
BrokenGlass
2
@BrokenGlass normalnie po prostu bym to zrobił, ale nie jestem przy komputerze ... właśnie użyłem telefonu, aby napisać wiadomość, ponieważ zaczynało się tworzyć rozwiązanie problemu i byłem ciekawy teraz! = P
Feisty Mango,

Odpowiedzi:

133

GetType()zwróci rzeczywisty, utworzony typ. W twoim przypadku, jeśli wywołasz GetType()instancję B, zwróci ona typeof(B), nawet jeśli dana zmienna jest zadeklarowana jako odwołanie do A.

Nie ma powodu dla twojej GetSubType()metody.

Reed Copsey
źródło
Czy to jednak? Mijam instancję obiektu z jego (abstrakcyjnej) super klasy, odbiorca widzi tylko superklasę. Czy nie jest tak, że zawsze zwróci to, co uchwyt został zdefiniowany jako nie instancja? - czy coś mi brakuje?
Aha .. Różnica jest przy użyciu typeof (X) vs. x.GetType () myślę
22

GetTypezawsze zwraca typ, który został faktycznie utworzony. tj. najbardziej pochodny typ. Oznacza to, że GetSubTypezachowujesz się tak jak on GetTypesam, a zatem jest niepotrzebny.

Aby uzyskać statyczne informacje o typie, których możesz użyć typeof(MyClass).

Twój kod zawiera jednak błąd: nie System.Attribute.GetCustomAttributeszwraca .Attribute[]Type

CodesInChaos
źródło
7

GetType zawsze zwraca rzeczywisty typ.

Przyczyną tego jest głęboka architektura .NET i środowisko CLR , ponieważ JIT i CLR używają rozszerzenia.GetType metody do tworzenia obiektu Type w pamięci, który przechowuje informacje o obiekcie, a cały dostęp do obiektu i kompilacji odbywa się za pośrednictwem tego wystąpienia Type .

Więcej informacji można znaleźć w książce „CLR via C #” wydanej przez Microsoft Press.

yoel halb
źródło