Gibt es eine Möglichkeit, Wert der privaten statischen Feld von bekannten Klasse mit Reflektion zu erhalten?Wie bekomme ich den Wert eines privaten statischen Feldes von einer Klasse?
Antwort
Ja.
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
Dies ist für ein Feld. Ändern Sie für eine Eigenschaft type.GetField
in type.GetProperty
. Sie können auf ähnliche Weise auch auf private Methoden zugreifen.
versuchen, etwas wie folgt aus:
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
ich denken würde, ist funktionieren sollte.
MemberInfo hat keine 'GetValue (...)' oder 'SetValue (...)' Methoden. Mitglieder sind häufiger tatsächliche Methoden/Funktionen. – IAbstract
Wie oben erwähnt, können Sie wahrscheinlich System.Type::GetMembers()
mit BindingFlags
::NonPublic | BindingFlags::Static
verwenden, aber nur, wenn Sie das Recht haben ReflectionPermission
.
Wenn Sie volles Vertrauen haben, sollten Sie in der Lage zu tun:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
Wenn Sie jedoch diese auf einem System ohne volles Vertrauen ausführen, wird der GetField Aufruf fehlschlagen, und das wird nicht funktionieren.
Ich nehme an, jemand sollte fragen, ob das eine gute Idee ist oder nicht? Es erstellt eine Abhängigkeit von der privaten Implementierung dieser statischen Klasse. Die private Implementierung unterliegt Änderungen, ohne dass Benutzer, die Reflection für den Zugriff auf die private Implementierung verwenden, benachrichtigt werden.
Wenn die beiden Klassen zusammenarbeiten sollen, sollten Sie das Feld intern erstellen und die Assembly der kooperierenden Klasse in ein [assembly: InternalsVisibleTo] -Attribut hinzufügen.
In Produktionscode ist dies in der Regel eine schlechte Idee. Es kann jedoch sehr nützlich sein, wenn Sie Komponententests durchführen, da Sie Tests schreiben können, ohne Felder freilegen zu müssen, die Sie lieber privat halten möchten. – AVee
@AVeee: für Unit-Tests, machen Sie das Feld "internal" und verwenden Sie "InternalsVisibleTo". Besser, Komponententests sollten die Implementierung nicht testen, sondern nur das Verhalten korrigieren. In Abhängigkeit vom privaten Feld bricht nun der Komponententest ab, wenn sich die Klassenimplementierung ändert. –
Ich stimme @JohnSaunders Reflexion wie diese ist sehr spröde. Es gibt jedoch Fälle, in denen es als vorübergehende Umgehung existieren sollte - d. H. Der Produktionscode ist bereits freigegeben, aber ich brauchte ein spezielles Dienstprogramm, um einige Akzeptanztests durchzuführen. Dies konnte ich nur erreichen, indem ich über Reflektion auf ein privates statisches Feld zugreife. Dieser Code wird geändert und die reflektierte Klasse wird geändert, um die Interaktion zu ermöglichen, die das neue Dienstprogramm in der nächsten Version benötigt. – IAbstract
- 1. Ändern eines privaten statischen Readonly-Feldes
- 2. Wie bekomme ich den Wert eines Feldes mit ng-Änderung
- 3. Wie bekomme ich die Klasse eines Feldes vom Typ T?
- 4. Wie bekomme ich den Wert eines Feldes von Mungo mongodb Abfrage? Dieses
- 5. Wie bekomme ich den Typ eines Feldes in Alfresco
- 6. Wie bekomme ich den Wert eines DynamicControl?
- 7. Wie erhalte ich den Wert eines Feldes während des Einfügens?
- 8. Wie finde ich den maximalen Wert eines Feldes in MYSQL?
- 9. Wie bekomme ich den Wert eines td
- 10. Wie bekomme ich den Wert eines XCUIElement?
- 11. C++ Schutz eines privaten char * einer Klasse
- 12. Wie bekomme ich eine Variable von einer privaten Methode zu einer statischen Methode?
- 13. Wie bekomme ich den maximalen Wert eines Feldes ohne Gruppierung in MySql
- 14. Wie bekomme ich den Wert eines Feldes, das an ein FormView gebunden wurde
- 15. Wie bekomme ich den Wert eines Datetime_select-Feldes mit Javascript in Ruby auf Schienen
- 16. Wie bekomme ich einen Service den aktualisierten Wert einer statischen Variable anstelle des Standardwerts
- 17. Testen eines privaten Feldes mit MSTest
- 18. Wert des privaten statischen Felds festlegen
- 19. MySQL - Wie bekomme ich SUM eines COUNT eines Feldes?
- 20. Wie behalte ich den Wert einer statischen Klassenvariablen in Spring?
- 21. Wie bekomme ich den Wert eines Kontrollkästchens von JQuery?
- 22. Warum ignoriert Unity den initialisierten Wert eines nicht statischen öffentlichen Feldes?
- 23. Schreiben eines Cookies aus einer statischen Klasse
- 24. Verwenden von privaten statischen Methoden
- 25. Wie bekomme ich einen Wert von einer Zelle eines Datenrahmens?
- 26. Wie bekomme ich den Wert von Spinner
- 27. Wie bekomme ich den Wert von @DiscriminatorColumn()?
- 28. Wie bekomme ich den Wert von @QueryParam
- 29. Erhalte den Wert eines Feldes, gegeben den hierarchischen Pfad
- 30. Wie bekomme ich den Wert von einer Combobox in PHP
Es ist vielleicht erwähnenswert, dass das statische Feld auch über 'info.SetValue (null, value)' zugewiesen werden kann. Ich habe diese Antwort verwendet, um einen Wert für ein statisches Feld festzulegen. – IAbstract