web-dev-qa-db-fra.com

GetType () renverra-t-il le type le plus dérivé lorsqu'il est appelé à partir de la classe de base?

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();
   }
}
112
Feisty Mango

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().

127
Reed Copsey

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.

22
CodesInChaos

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.

7
yoel halb