使用反射对具有私有 setter 的属性进行 SetValue

本文关键字:属性 SetValue setter 反射 | 更新日期: 2023-09-27 18:32:50

我遇到了,我认为是一个错误,实际上是这篇文章中详细介绍的功能。谁能向我解释为什么允许这样做?这似乎是一个有用的遗留怪癖/错误。

使用反射对具有私有 setter 的属性进行 SetValue

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

C# 中的访问修饰符不是安全机制。如果您依靠私有字段来防止任何人从外部设置它,那么您就做错了。它们的存在是为了清楚地描述类的哪些部分是公共契约(因此,理论上是稳定的(,以及那些作为实现细节的部分(因此可以在不通知的情况下更改(。

如果您选择使用反射来更改对象的内部状态,尽管所有迹象表明您应该不理会它,但您正在将应用程序的稳定性掌握在自己手中,并且您得到了应得的。

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