GetType () renverra-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();
}
}
GetType()
renverra le type réel instancié. Dans votre cas, si vous appelez GetType()
sur une instance de B
, elle renverra typeof(B)
, même si la variable en question est déclarée comme référence à un A
.
Il n'y a aucune raison pour votre méthode GetSubType()
.
GetType
renvoie toujours le type réellement instancié. c'est-à-dire le type le plus dérivé. Cela signifie que votre GetSubType
se comporte exactement comme GetType
lui-même et n'est donc pas nécessaire.
Pour obtenir de manière statique les informations de type d'un certain type, vous pouvez utiliser typeof(MyClass)
.
Votre code contient cependant une erreur: System.Attribute.GetCustomAttributes
résultats Attribute[]
pas Type
.
GetType renvoie toujours le type réel.
La raison en est profondément ancrée dans le cadre . NET et CLR , car le JIT et le CLR utilisent le .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.