116 votes

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

130voto

Reed Copsey Points 315315

GetType() renverra le type actuel, instancié. Dans votre cas, si vous appelez GetType() sur une instance de B , il renverra typeof(B) , même si la variable en question est déclarée en tant que référence à un A .

Il n'y a aucune raison pour votre méthode GetSubType() .

22voto

CodesInChaos Points 60274

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 et est donc inutile.

Pour obtenir statiquement les informations de type d'un type, vous pouvez utiliser typeof(MyClass) .

Votre code comporte cependant une erreur: System.Attribute.GetCustomAttributes renvoie Attribute[] pas Type .

7voto

yo hal Points 1949

GetType renvoie toujours le type réel.

La raison pour laquelle il est au fond de la .NET framework et CLR, comme le JIT et CLR utiliser l' .GetType méthode pour créer un Type d'objet en mémoire qui contient les informations sur l'objet, et tous les accès à l'objet et de la compilation par le biais de ce Type d'instance.

Pour plus d'informations, jetez un coup d'oeil dans le livre "CLR via C#" Microsoft Press.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X