繁体   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