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

118

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();
   }
}
Mangue Feisty
la source
10
eh bien - l'avez-vous essayé?
BrokenGlass
2
@BrokenGlass normalement je ferais juste ça mais je ne suis pas devant un ordinateur ... je viens d'utiliser mon téléphone pour faire le message car une solution à un problème commençait à se former et j'étais curieuse de savoir maintenant! = P
Feisty Mango

Réponses:

133

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

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

Reed Copsey
la source
Le fait-il cependant? Je passe une instance d'un objet de sa super classe (abstraite), le récepteur ne voit que la super classe. N'est-ce pas qu'il retournera toujours ce que le handle a été défini comme non l'instance? - ou est-ce que je manque quelque chose?
Ah ha .. la différence utilise TypeOf (X) contre x.GetType () je pense
22

GetTyperenvoie toujours le type qui a été réellement instancié. c'est-à-dire le type le plus dérivé. Cela signifie que votre GetSubTypecomportement se comporte exactement comme GetTypelui-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.GetCustomAttributesrenvoie Attribute[]pas Type.

CodesInChaos
la source
7

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 .GetTypemé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.

yoel halb
la source