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

Mar*_*rkP 2 c# reflection

我遇到了,我认为实际上是一个bug,这篇文章详细介绍了一个功能.任何人都可以向我解释为什么允许这样做?这似乎是一个有用的传统怪癖/错误.

Mic*_*eld 6

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

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

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