【问题标题】:Using reflection to SetValue on property with private setter在具有私有设置器的属性上使用对 SetValue 的反射
【发布时间】:2012-05-10 16:04:53
【问题描述】:

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

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    反射只允许完全信任代码,因此代码已经能够做任何事情(包括直接在进程的内存中戳)。因此,即使对于私有属性,支持更改值的方式也不会降低代码的安全性。它使反射 API 保持一致,并允许有用的场景,特别是对于测试。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我不太确定这不是安全机制。部分受信任的代码无法访问其他类型的私有成员是有原因的。
      猜你喜欢
      • 2018-07-25
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2012-03-02
      • 2010-12-06
      • 2011-09-20
      相关资源
      最近更新 更多