2010-10-08 5 views
4

J'essaie de refléter les champs dans un type dérivé mais il retourne les champs du type de base .GetFields de type dérivé

public class basetype 
{ 
    string basevar; 
} 

public class derivedtype : basetype 
{ 
    string derivedvar; 
} 

Dans une fonction:

derivedtype derived = new derivedtype(); 

FieldInfo[] fields = derived.GetType().GetFields(); 

Cela renverra basevar, mais pas derivedvar. J'ai essayé toutes les reliures différentes et cela ne semble pas faire de différence.

En outre, je le fais dans ASP.NET dans App_Code où basevar est défini dans App_Code et derivedvar est un contrôle utilisateur défini dans App_Controls où les types ne sont pas dans la portée.

+1

Votre code a fonctionné pour moi (je vois 'derivedvar'), une fois que je fais les champs publics de les exposer à 'GetFields()'. Êtes-vous certain de votre hiérarchie de classe? Avez-vous essayé le code ci-dessus dans un projet autonome? –

+1

Dans le code ci-dessus, 'derivedtype' ne dérive même pas de' basetype', vous devriez donc voir 'derivedvar' (avec BindingFlags.NonPublic), mais pas' basevar'. – dtb

+0

@dtb: J'avais raté ça. Juste réanan avec la dérivation appropriée; mêmes résultats. –

Répondre

7

En l'état, cela ne retournera rien car la liaison par défaut est réservée aux champs publics.

Comme aussi, derivedtype ne dérive pas de basetype

Avec:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 

Il retourne derivedvar. Je viens de vérifier dans LINQPad.

Si je change derivedtype à dériver de basetype, je peux obtenir les deux champs avec:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray(); 
+0

Voilà, j'essayais d'obtenir les membres privés aussi, mais je ne pouvais pas le faire fonctionner jusqu'à ce que je rende les membres privés. Un oubli stupide de ma part les gars, désolé. – KenEucker

2

La réflexion est un peu étrange.

Si les membres sont publics, tous les membres de la hiérarchie entière sont visibles.

Si les membres ne sont pas publics, vous devez spécifier BindingFlags.NonPublic et vous obtiendrez uniquement les membres du type utilisé. Les membres hérités ne sont pas visibles. Si vous voulez voir tous les membres non-publics d'un type, vous devrez remonter la chaîne d'héritage.

+0

Ce n'est pas "impair", mais exactement comment il devrait être. Imaginez que vous puissiez attribuer un nom à un champ d'une classe dérivée, à l'exception du nom d'un champ privé dans la classe de base. Alors ce champ privé ne serait plus aussi privé. – dtb

+0

Corrigez-moi si je me trompe, mais je pense que vous ne comprenez pas le problème ici. Mon problème est de tenter d'obtenir les membres dérivés, il retourne déjà les membres hérités de la classe de base mais ne retourne aucun des membres de la classe dérivée. J'ai essayé BindingFlags.NonPublic mais cela n'a pas fonctionné non plus. – KenEucker

+0

@ Epic720: comme je l'ai mentionné plus haut, je soupçonne que la hiérarchie de votre classe n'est pas celle que vous décrivez (en fait, elle ne peut l'être - les deux classes que vous montrez dans votre exemple ne sont même pas liées entre elles!). Pouvez-vous pirater votre véritable hiérarchie jusqu'à quelque chose que vous pouvez poster? –

Questions connexes