58 votes

Utilisation de GetProperties () avec BindingFlags.DeclaredOnly dans .NET Reflection

Si j'utilise

 sometype.GetProperties();
 

Je reçois toutes les propriétés du type et de son parent. Cependant, je veux seulement récupérer les propriétés définies explicitement dans ce type (pas les parents). Je pensais que c’était la raison pour laquelle l’option BindingFlags.DeclaredOnly était utilisée.

Cependant, quand j'essaye ceci:

 sometype.GetProperties(BindingFlags.DeclaredOnly);
 

Je reçois 0 propriétés.

Quelqu'un sait ce que je fais mal?

83voto

Pete Points 6387

Si vous spécifiez des BindingFlags , vous devez spécifier explicitement les propriétés que vous souhaitez obtenir. Par exemple:

 sometype.GetProperties (BindingFlags.DeclaredOnly | 
                        BindingFlags.Public | 
                        BindingFlags.Instance);
 

47voto

Groo Points 19453

Pour résumer:

  1. si vous utilisez l' GetProperties() de surcharge (sans paramètres), vous obtiendrez toutes les propriétés publiques.

  2. d'autre part, si vous utilisez l' GetProperties(BindingFlags) de surcharge (celui qui accepte BindingFlags paramètre), puis vous devez spécifier une logique OU d'au moins un de chaque groupe d'indicateurs suivants:

    • BindingFlags.Instance / BindingFlags.Static (instance vs propriétés statiques),
    • BindingFlags.Public / BindingFlags.NonPublic (public vs non-public des propriétés).

Par exemple, pour obtenir public propriétés statiques, vous aurez besoin de faire appel GetProperties(BindingFlags.Public | BindingFlags.Static) afin d'obtenir des résultats. Les appels GetProperties(BindingFlags.Public) ou GetProperties(BindingFlags.Static) ne retournera aucun résultat.

Notez également que la spécification BindingFlags.Default renvoie un tableau vide.

Plus de détails peuvent être trouvés dans la documentation MSDN pour GetProperties(BindingFlags):

La suite BindingFlags filtre indicateurs peuvent être utilisés pour définir les types imbriqués à inclure dans la recherche:

  • Vous devez spécifier BindingFlags.Instance ou BindingFlags.Static afin d'obtenir un retour.
  • Spécifier BindingFlags.Public d'inclure des méthodes publiques de la recherche.
  • Spécifier BindingFlags.NonPublic d'inclure des méthodes publiques (c'est -, privé, interne, et les méthodes protected) dans la recherche. Seulement protégés et de méthodes internes sur les classes de base sont retournés; les méthodes privées sur les classes de base ne sont pas retournés.
  • Spécifier BindingFlags.FlattenHierarchy d'inclure publiques et protégées statique des membres de la hiérarchie; private static membres dans les classes héritées ne sont pas inclus.

La suite BindingFlags modificateur indicateurs peuvent être utilisés pour modifier la façon dont la recherche fonctionne:

  • BindingFlags.DeclaredOnly pour rechercher uniquement les propriétés déclarées sur le Type, pas les propriétés qui ont été tout simplement hérité.

15voto

JaredPar Points 333733

Vous devez développer votre BindingsFlag un peu. Ils doivent au moins inclure quel niveau d'accessibilité et quelle instance par rapport à statique pour obtenir quelque chose de significatif.

Je pense que ce que vous recherchez réellement est le suivant

 var flags = BindingFlags.DeclaredOnly 
  | BindingFlags.Instance
  | BindingFlags.Public;
someType.GetProperties(flags);
 

0voto

Rohit Points 2629

À partir du site MSDN .

Default (membre) Ne spécifie aucun indicateur de liaison.

Vous devez spécifier Instance ou Static avec Public ou NonPublic, sinon aucun membre ne sera renvoyé.

Par conséquent, à moins de spécifier les indicateurs de liaison, vous n’obtenez rien.

-1voto

Serj Sagan Points 2731

J'ai eu des problèmes en utilisant typeof(Thing) , finalement cela a fonctionné pour moi:

         var thisThing = (new Thing()).GetType();
        foreach (var property in thisThing.GetProperties())
        {
            // ...
        }
 

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