Existe-t-il un moyen d'obtenir la valeur du champ statique privé d'une classe connue en utilisant la réflexion?Comment obtenir la valeur d'un champ statique privé d'une classe?
Répondre
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.
Essayez quelque chose comme ceci:
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
Je pense que c'est devrait fonctionner.
MemberInfo n'a pas les méthodes 'GetValue (...)' ou 'SetValue (...)'. Les membres sont plus souvent des méthodes/fonctions réelles. – IAbstract
Comme indiqué ci-dessus, vous pouvez probablement utiliser System.Type::GetMembers()
avec BindingFlags
::NonPublic | BindingFlags::Static
, mais seulement si vous avez le droit ReflectionPermission
.
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.
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].
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
@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. –
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
- 1. valeur Get de champ statique
- 2. comment refrence classe Linq2SQL d'une classe statique
- 3. Accès à la valeur d'une classe statique dans une classe statique
- 4. Comment faire pour muter un champ privé de la classe abstraite en Java?
- 5. Trouver un champ privé avec Reflection?
- 6. comment utiliser prev pour obtenir la valeur d'un champ d'entrée
- 7. Définition de la valeur d'un champ de la classe dérivée
- 8. Composant enfant statique/privé dans mxml?
- 9. Comment concevoir une classe statique?
- 10. GWT pour obtenir la valeur du champ date
- 11. Obtenir la valeur MasterPage Hiddenfield d'une classe d'utilisateurs
- 12. typedef privé visible dans la classe dérivée
- 13. Comment hiberner peut-il accéder à un champ privé?
- 14. Obtenir la valeur de chaîne dans la classe de chaîne
- 15. Bizarre d'accès de champ privé parent/enfant avec fermeture
- 16. Affectation au champ de lecture statique de la classe de base
- 17. refactorisation méthode/champ statique statique pour les tests
- 18. SharePoint - obtenir la valeur du champ calculé sans analyse manuelle
- 19. Comment obtenir la valeur d'un DynamicControl?
- 20. Impossible de rendre un objet lock privé dans une classe statique - pourquoi?
- 21. Conception de classe: constructeur public ou privé avec usine statique et un objet COM
- 22. Comment changer la valeur du champ associé
- 23. Entity Framework: Setter privé sur une classe abstraite
- 24. Récupération champ statique dans la méthode générique par l'expression lambda
- 25. C# Quelle est la différence entre la classe statique et non statique (je parle de la classe elle-même pas le champ)
- 26. faire une fonction statique/classe en dehors de la classe
- 27. Obtenir la valeur de NSTextField
- 28. Comment obtenir la valeur de champ précédente dans la méthode modifiedField d'une table Dynamic Axe?
- 29. constructeur privé, sous-classe et scellé
- 30. Comment rendre le constructeur de classe privé dans Ruby?
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