我碰到,我認爲是一個錯誤實際上,This post詳細的功能。任何人都可以向我解釋爲什麼這是允許的嗎?這似乎是一個遺留的怪癖/錯誤,變得有用。使用反射SetValue屬性與私人setter
2
A
回答
6
我不確定你認爲哪一部分是一個bug,但是如果你不能在編譯時這樣做,一直可以通過反射來訪問一個類的內部。這是設計。 CLR的許多方面都依賴反射來訪問字段,例如序列化。已編譯的IL需要能夠訪問所有對象的所有字段,否則您不能在內設置的專用字段。
C#中的訪問修飾符不是安全機制。如果你依靠的是一個私人領域,以防止任何人從外部設置它,那麼你做錯了什麼。它們的存在是爲了清楚地描述你的班級的哪些部分是公共合同(因此在理論上是穩定的),這些部分是實現細節的部分(因此可以不經通知而改變)。改變一個對象的內部狀態,儘管所有跡象表明你應該放棄它,你將你的應用程序的穩定性掌握在你自己的手中,並且你得到了應有的東西。
0
僅允許完全信任代碼進行反射,因此代碼已能夠執行任何操作(包括直接在進程的內存中戳)。因此,即使對於私有屬性也支持更改值的方式不會使代碼更安全。它使反射API一致,並允許有用的場景,尤其是測試。
相關問題
- 1. 與私人setter的AutoMapper映射屬性
- 2. 私人-setter屬性
- 3. 如何在反射中使用索引屬性的SetValue?
- 4. C#反射SetValue
- 5. protobuf-net沒有序列化與私人setter的C#屬性
- 6. 使用反射訪問私人會員
- 7. 使用反射,我如何檢測具有setter的屬性。
- 8. 私人屬性
- 9. 使用屬性反射測試屬性
- 10. C#使用IDictionary嵌套反射SetValue
- 11. 使用私人或使用屬性? C#
- 12. SetValue屬性反射異常處理問題
- 13. 使用java反射從MainActivity類訪問私有屬性 - 字段
- 14. Angular2注射 - 使用私人與@Inject
- 15. Spring.NET如何使用私人setter?
- 16. SetValue內反射的ProperyInfo
- 17. 的SetValue反射在C#
- 18. 私人依賴屬性綁定相比,私人CLR屬性
- 19. 問題與私人集列表屬性
- 20. 將泛型屬性與反射/ Cast屬性映射到泛型
- 21. 使用反射來調用屬性
- 22. 通過反射獲取bean屬性getter或setter?
- 23. Javascript屬性反射
- 24. 反射不允許私人的Throwable
- 25. 使用反射獲取屬性的值
- 26. 使用反射設置對象屬性
- 27. C#中使用反射屬性?
- 28. 使用反射選擇一些屬性
- 29. 使用反射設置屬性值
- 30. 使用反射來解決Linqed屬性
我不太確定它不是一個安全機制。部分受信任的代碼不能訪問其他類型的私有成員是有原因的。 – svick
很好的回答.... – MarkP