2009-03-10 12 views

Répondre

60

Oui.

Type type = typeof(TheClass); 
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static); 
object value = info.GetValue(null); 

Ceci est pour un champ. Pour une propriété, remplacez type.GetField par type.GetProperty. Vous pouvez également accéder aux méthodes privées de la même manière.

+1

Il peut être intéressant de noter que le champ statique peut également être affecté via 'info.SetValue (null, value)'. J'ai utilisé cette réponse pour définir une valeur à un champ statique. – IAbstract

-1

Essayez quelque chose comme ceci:

Type type = typeof(MyClass); 
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static); 

Je pense que c'est devrait fonctionner.

+0

MemberInfo n'a pas les méthodes 'GetValue (...)' ou 'SetValue (...)'. Les membres sont plus souvent des méthodes/fonctions réelles. – IAbstract

1

Si vous avez pleine confiance, vous devriez être en mesure de le faire:

Type t = typeof(TheClass); 
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static); 
object fieldValue = field.GetValue(myObject); 

Cependant, si vous exécutez ce sur un système sans confiance totale, l'appel GetField échouera, et cela ne fonctionnera pas.

5

Je suppose que quelqu'un devrait demander si c'est une bonne idée ou non? Cela crée une dépendance à l'implémentation privée de cette classe statique. La mise en œuvre privée peut être modifiée sans préavis donné aux personnes utilisant Reflection pour accéder à la mise en œuvre privée.

Si les deux classes doivent fonctionner ensemble, envisagez de créer le champ interne et d'ajouter l'assembly de la classe de coopération dans un attribut [assembly: InternalsVisibleTo].

+1

Dans le code de production, c'est généralement une mauvaise idée. Il peut cependant être très utile lors des tests unitaires, car vous pouvez écrire des tests sans avoir à exposer les champs que vous préférez garder privés. – AVee

+3

@AVee: pour les tests unitaires, faites le champ 'internal' et utilisez' InternalsVisibleTo'. Mieux, les tests unitaires ne devraient pas tester l'implémentation, seulement corriger le comportement. En fonction du domaine privé, le test unitaire se casse si l'implémentation de la classe change. –

+1

Je suis d'accord avec la réflexion @JohnSaunders comme ceci est très fragile. Il y a des cas cependant où il devrait exister comme un travail temporaire - c'est-à-dire que le code de production est déjà publié, mais j'avais besoin d'un utilitaire spécial pour exécuter certains tests d'acceptation. Je ne pouvais y parvenir qu'en accédant à un champ statique privé par réflexion. Ce code va changer et la classe reflétée sera modifiée pour permettre l'interaction requise par le nouvel utilitaire dans la prochaine version. – IAbstract

Questions connexes