GetType () retournera-t-il le type le plus dérivé lorsqu'il est appelé à partir de la classe de base?
Exemple:
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 devrais-je simplement créer une méthode abstraite que les classes dérivées devront implémenter comme suit?
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
Mangue Feisty
la source
la source
Réponses:
GetType()
renverra le type réel instancié. Dans votre cas, si vous appelezGetType()
une instance deB
, elle retourneratypeof(B)
, même si la variable en question est déclarée comme une référence à unA
.Il n'y a aucune raison pour votre
GetSubType()
méthode.la source
GetType
renvoie toujours le type qui a été réellement instancié. c'est-à-dire le type le plus dérivé. Cela signifie que votreGetSubType
comportement se comporte exactement commeGetType
lui-même et n'est donc pas nécessaire.Pour obtenir statiquement les informations de type d'un certain type, vous pouvez utiliser
typeof(MyClass)
.Votre code a cependant une erreur: ne
System.Attribute.GetCustomAttributes
renvoieAttribute[]
pasType
.la source
GetType renvoie toujours le type réel.
La raison en est profondément dans le framework .NET et CLR , car le JIT et le CLR utilisent la
.GetType
méthode pour créer un objet Type en mémoire qui contient les informations sur l'objet, et tous les accès à l'objet et à la compilation se font via cette instance Type .Pour plus d'informations, consultez le livre «CLR via C #» de Microsoft Press.
la source