在私有setter的属性上使用反射到SetValue

时间:2012-05-01 01:18:56

标签: c# reflection

我遇到了,我认为实际上是一个错误,This post中详细介绍了一个功能。任何人都可以向我解释为什么允许这样做?这似乎是一个遗留的怪癖/错误变得有用。

2 个答案:

答案 0 :(得分:6)

我不确定您认为哪个部分是错误,但是在编译时无法通过反射访问类的内部。这是设计的。 CLR的许多方面依赖于反射来访问字段,例如序列化。已编译的IL需要能够访问所有对象的所有字段,否则您无法在类中的中设置私有字段。

C#中的访问修饰符不是安全机制。如果你依靠一个私人的领域来阻止任何人从外面设置它,你就会做错事。它们的存在是为了清楚地描述你的班级的哪些部分是公共合同(因此,在理论上,从理论上讲,稳定)来自那些作为实施细节的部分(因此可以在不事先通知的情况下改变。)

如果您选择使用反射来改变对象的内部状态,尽管有迹象表明您应该单独使用它,您可以将应用程序的稳定性掌握在自己手中,并获得应得的效果。

答案 1 :(得分:0)

只允许对完全信任代码进行反射,因此代码已经能够执行任何操作(包括直接戳入进程的内存)。因此,即使对于私有属性,支持更改值的方法也不会使代码不那么安全。它使反射API保持一致,并允许特别用于测试的有用场景。