簡體   English   中英

使用帶有私有setter的屬性對SetValue進行反射

[英]Using reflection to SetValue on property with private setter

我遇到了,我認為實際上是個錯誤, 這是本帖子中詳細介紹的功能。 誰能向我解釋為什么允許這樣做? 似乎是一個古老的怪癖/錯誤變得有用。

我不確定您認為哪一部分是錯誤,但是在編譯時無法進行反射時,始終可以通過反射來訪問類的內部。 這是設計使然。 CLR的許多方面都依賴於對訪問字段的反射,例如序列化。 編譯后的IL必須能夠訪問所有對象的所有字段,否則您將無法類中設置私有字段。

C#中的訪問修飾符不是安全機制。 如果您依靠私有字段來阻止任何人從外部進行設置,那么您在做錯什么。 它們的存在是為了從與實現細節相關的那些部分(因此可以隨時更改,恕不另行通知)中清楚地區分出您的課程的哪些部分是公共合同(理論上是穩定的)。

如果您選擇使用反射來更改對象的內部狀態,盡管有種種跡象表明您應該不理會它,但您會將應用程序的穩定性掌握在自己手中,您將得到應有的回報。

只有完全信任代碼才允許進行反射,因此該代碼已經可以執行任何操作(包括直接戳入進程的內存)。 因此,即使使用私有屬性也支持更改值的方法不會降低代碼的安全性。 它使反射API保持一致,並允許使用一些有用的方案,尤其是用於測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM