6
votes

Gettype () renvoie le type de sous-classe dans le constructeur de superclasse

J'ai trois classes: classa , classb , classc .

classc étend classb qui s'étend à son tour classa .

Lorsque j'appelle gettype () à partir de CLASSA S.-Net renvoie classc S. Je suis déconcerté parce que cela se passe dans le code qui travaille depuis un moment et que je n'ai pas touché depuis un moment. Y avait-il un correctif à .Net qui a changé le comportement de gettype ()? Je doute que. Ma seule autre pensée est que cela a quelque chose à voir avec Xunit, le cadre de test que j'utilise?


1 commentaires

Tous - merci! Tout le monde semble dire la même chose ... que cela fonctionne comme prévu et que cela a toujours.


4 Réponses :


13
votes

Cela se comporte exactement comme il est censé. gettype () renvoie le type réel de l'instance de l'objet, même s'il s'agit d'une sous-classe (et il a toujours se comportait de cette façon). typeof (classa) d'autre part vous donnerait toujours le type de classa .


1 commentaires

Bizarre ... Je ne sais pas comment mes tests d'unité auraient passé. Quoi qu'il en soit, il semble que je devais utiliser typeof ()



2
votes

Si j'ai bien compris votre problème, vous avez un type classa A et en l'appelant, vous obtenez classc . Si tel est le cas, il n'est probablement pas un clasa objet, mais c'est quelque chose comme ceci:

Quelque part dans le code, vous avez une initialisation comme suit:

CLASSA A = New ClassC () .

Considérant que classc: classb et classb: classa vous peut faire cela.

gettype () renvoie un type d'objet réel et non type d'emballage.


0 commentaires

1
votes

Autant que je me souvienne, GetType () a toujours renvoyé le type de l'instance, pas la classe de base, quel que soit son endroit où il s'appelle.


0 commentaires

2
votes

La fonction gettype code> se comporte comme prévu. Il devrait toujours retourner le type d'exécution réel de la valeur. Je ne crois pas que les patchs chauds ont changé ce comportement, mais le comportement que vous voyez maintenant est définitivement correct.

Si vous voulez voir le type déclaré de la méthode, utilisez l'une des informations suivantes P>

typeof(TheContainingType)
MethodBase.GetCurrentMethod().DeclaringType


0 commentaires