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();
}
}
c#
inheritance
polymorphism
Feisty Mango
quelle
quelle
Antworten:
GetType()
gibt den tatsächlichen instanziierten Typ zurück. Wenn Sie in Ihrem FallGetType()
eine Instanz von aufrufenB
, wird diese zurückgegebentypeof(B)
, auch wenn die betreffende Variable als Referenz auf eine deklariert istA
.Es gibt keinen Grund für Ihre
GetSubType()
Methode.quelle
GetType
Gibt immer den Typ zurück, der tatsächlich instanziiert wurde. dh der am meisten abgeleitete Typ. Dies bedeutet, dass SieGetSubType
sich genauso verhalten wie SieGetType
selbst 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.GetCustomAttributes
GibtAttribute[]
nicht zurückType
.quelle
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
.GetType
Methode 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.
quelle