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();
}
}
c#
inheritance
polymorphism
Zadziorna Mango
źródło
źródło
Odpowiedzi:
GetType()
zwróci rzeczywisty, utworzony typ. W twoim przypadku, jeśli wywołaszGetType()
instancjęB
, zwróci onatypeof(B)
, nawet jeśli dana zmienna jest zadeklarowana jako odwołanie doA
.Nie ma powodu dla twojej
GetSubType()
metody.źródło
GetType
zawsze zwraca typ, który został faktycznie utworzony. tj. najbardziej pochodny typ. Oznacza to, żeGetSubType
zachowujesz się tak jak onGetType
sam, 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.GetCustomAttributes
zwraca .Attribute[]
Type
źródło
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.
źródło