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

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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.