Gibt GetType () den am meisten abgeleiteten Typ zurück, wenn es von der Basisklasse aufgerufen wird?

118

Gibt GetType () den am meisten abgeleiteten Typ zurück, wenn es von der Basisklasse aufgerufen wird?

Beispiel:

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
}

Oder sollte ich einfach eine abstrakte Methode erstellen, die die abgeleiteten Klassen wie folgt implementieren müssen?

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
quelle
10
gut - hast du es ausprobiert?
BrokenGlass
2
@BrokenGlass Normalerweise würde ich das einfach tun, aber ich bin nicht an einem Computer ... habe nur mein Handy benutzt, um den Beitrag zu schreiben, weil sich eine Lösung für ein Problem herausbildete und ich neugierig war, es jetzt zu wissen! = P
Feisty Mango

Antworten:

133

GetType()gibt den tatsächlichen instanziierten Typ zurück. Wenn Sie in Ihrem Fall GetType()eine Instanz von aufrufen B, wird diese zurückgegeben typeof(B), auch wenn die betreffende Variable als Referenz auf eine deklariert ist A.

Es gibt keinen Grund für Ihre GetSubType()Methode.

Reed Copsey
quelle
Tut es aber? Ich übergebe eine Instanz eines Objekts aus seiner (abstrakten) Superklasse, der Empfänger sieht nur die Superklasse. Ist es nicht so, dass es immer zurückgibt, was das Handle als nicht die Instanz definiert wurde? - oder fehlt mir etwas
Ah ha .. der Unterschied ist die Verwendung von TypeOf (X) vs. x.GetType (), denke ich
22

GetTypeGibt immer den Typ zurück, der tatsächlich instanziiert wurde. dh der am meisten abgeleitete Typ. Dies bedeutet, dass Sie GetSubTypesich genauso verhalten wie Sie GetTypeselbst und daher nicht erforderlich sind.

Um statisch die Typinformationen eines Typs abzurufen, den Sie verwenden können typeof(MyClass).

Ihr Code hat jedoch einen Fehler: System.Attribute.GetCustomAttributesGibt Attribute[]nicht zurück Type.

CodesInChaos
quelle
7

GetType gibt immer den tatsächlichen Typ zurück.

Der Grund dafür liegt tief im .NET Framework und in der CLR , da JIT und CLR die .GetTypeMethode verwenden, um ein Typobjekt im Speicher zu erstellen, das die Informationen zum Objekt enthält, und der gesamte Zugriff auf das Objekt und die Kompilierung über diese Typinstanz erfolgt .

Weitere Informationen finden Sie im Buch "CLR via C #" von Microsoft Press.

yoel halb
quelle