[英]Using reflection to SetValue on property with private setter
我不確定您認為哪一部分是錯誤,但是在編譯時無法進行反射時,始終可以通過反射來訪問類的內部。 這是設計使然。 CLR的許多方面都依賴於對訪問字段的反射,例如序列化。 編譯后的IL必須能夠訪問所有對象的所有字段,否則您將無法在類中設置私有字段。
C#中的訪問修飾符不是安全機制。 如果您依靠私有字段來阻止任何人從外部進行設置,那么您在做錯什么。 它們的存在是為了從與實現細節相關的那些部分(因此可以隨時更改,恕不另行通知)中清楚地區分出您的課程的哪些部分是公共合同(理論上是穩定的)。
如果您選擇使用反射來更改對象的內部狀態,盡管有種種跡象表明您應該不理會它,但您會將應用程序的穩定性掌握在自己手中,您將得到應有的回報。
只有完全信任代碼才允許進行反射,因此該代碼已經可以執行任何操作(包括直接戳入進程的內存)。 因此,即使使用私有屬性也支持更改值的方法不會降低代碼的安全性。 它使反射API保持一致,並允許使用一些有用的方案,尤其是用於測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.