Esiste un modo per ottenere il valore del campo statico privato dalla classe nota utilizzando la riflessione?Come ottenere il valore di un campo statico privato da una classe?
risposta
Sì.
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
Questo è per un campo. Per una proprietà, modificare type.GetField
in type.GetProperty
. Puoi anche accedere a metodi privati in modo simile.
provare qualcosa di simile:
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
Vorrei pensare che è dovrebbe funzionare.
MemberInfo non ha metodi 'GetValue (...)' o 'SetValue (...)'. I membri sono più spesso metodi/funzioni reali. – IAbstract
Come detto sopra, probabilmente si può utilizzare System.Type::GetMembers()
con BindingFlags
::NonPublic | BindingFlags::Static
, ma solo se si ha il diritto ReflectionPermission
.
Se hai piena fiducia, si dovrebbe essere in grado di fare:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
Tuttavia, se si esegue questo su un sistema senza la piena fiducia, la chiamata GetField fallirà, e questo non funzionerà.
Suppongo che qualcuno dovrebbe chiedere se questa è una buona idea o no? Crea una dipendenza dall'implementazione privata di questa classe statica. L'implementazione privata è soggetta a modifiche senza alcun preavviso dato alle persone che utilizzano Reflection per accedere all'implementazione privata.
Se le due classi devono funzionare insieme, valutare la possibilità di creare il campo interno e di aggiungere l'assembly della classe cooperante in un attributo [assembly: InternalsVisibleTo].
Nel codice di produzione questa è generalmente una cattiva idea. Può tuttavia essere molto utile quando si esegue il test delle unità, perché è possibile scrivere test senza dover esporre campi che preferiresti mantenere privati. – AVee
@AVee: per il test dell'unità, rendere il campo 'internal' e utilizzare' InternalsVisibleTo'. Meglio, i test unitari non dovrebbero testare l'implementazione, solo un comportamento corretto. In base al campo privato, ora il test unitario si interromperà se l'implementazione della classe cambia. –
Sono d'accordo con la riflessione di @JohnSaunders come questa è molto fragile. Ci sono casi, tuttavia, in cui dovrebbe esistere un lavoro temporaneo - cioè il codice di produzione è già stato rilasciato, ma avevo bisogno di un'utilità speciale per eseguire alcuni test di accettazione. Ho potuto ottenere questo solo accedendo a un campo statico privato tramite la riflessione. Questo codice cambierà e la classe riflessa verrà modificata per consentire l'interazione richiesta dalla nuova utilità nella prossima versione. – IAbstract
- 1. Valore impostato del campo statico privato
- 2. Mock un campo statico privato con JMockit?
- 3. valore Set di campo privato
- 4. Come ereditare il campo statico e modificarne il valore?
- 5. Rifattorizzazione per spostare un campo privato da una classe alla sua classe helper?
- 6. Come ottenere l'equivalente di un campo statico (di classe) in Delphi?
- 7. C# privato, statico e readonly
- 8. C#: come si chiama un metodo statico di una classe base da un metodo statico di una classe derivata?
- 9. Come ottenere il valore di un campo con ng-change
- 10. C# campo statico classe astratta eredità
- 11. Come posso fare riferimento al valore di un campo statico finale nella classe?
- 12. Come ottenere MethodInfo del metodo statico di una classe statica
- 13. Come posso ottenere il valore di una variabile di sessione all'interno di un metodo statico?
- 14. Una classe che fa riferimento a se stessa in un campo statico può essere eliminata?
- 15. Ottenere il valore da una cella Gridview
- 16. L'oggetto Scala estende il campo statico della classe Java
- 17. Una proprietà astratta crea un campo di supporto privato?
- 18. Come ottenere il campo "Dati" da xhr.responseText?
- 19. Get di campo statico
- 20. Campo modello statico della classe template?
- 21. Come ottenere il logger di una classe in un contesto statico?
- 22. Come ottenere la classe di un campo di tipo T?
- 23. Come ottenere (sotto) il nome della classe da un metodo statico in Python?
- 24. Come ottenere un valore da una cella di un dataframe?
- 25. Android che modifica il campo finale statico privato utilizzando Java Reflection?
- 26. Iniezione @ Campo privato autorizzato durante il test
- 27. Come implementare correttamente il mio campo vuoto o zero statico
- 28. Come chiamare un metodo privato dall'esterno di una classe java
- 29. Come rendere il valore della molla iniettata in un campo statico
- 30. C++ Accesso al membro statico privato dal metodo statico pubblico?
Potrebbe valere la pena notare che il campo statico può anche essere assegnato tramite 'info.SetValue (null, value)'. Ho usato questa risposta per impostare un valore su un campo statico. – IAbstract