我之前在公共方法上多次使用反射,但我从未意识到私有方法也可以被调用。看 与私人成员的反思.

首先为什么允许这样做?这不是要打破“私人”就是“私人”的规则吗?

有帮助吗?

解决方案

C#中的 private 实际上只是语言规范的一部分;在C#语言中,以及在Visual Basic语言或任何其他合理的.NET语言中(包括 CIL ,所有.NET语言编译的内容)一个被阻止访问 private (或 protected ,如果你不在派生类中)成员< strong>语言。但是,仅仅因为该语言不支持公开访问 private protected 成员并不意味着底层框架无法提供访问权限那些成员。

这是其中一个通常不应该使用反射等变通方法访问或修改 private protected 成员的情况之一,但无论如何,框架允许一个人。通常,您应该非常有充分的理由来访问 private protected 成员;例如,一个这样的原因是实现了一个序列化器,它需要查看对象的内部状态才能正确地序列化对象。如果你没有做那样的事情,你应该真正重新考虑重新实现你内心深处的课程,这样你就不需要在程序中使用反射。

其他提示

仅当代码在完全信任(或具有相关权限)下运行时才允许这样做。否则,将抛出 MethodAccessException

该框架完全能够适当地限制访问 - 当您在完全信任下运行或具有特定权限时,它不会这样做。有关何时更多详细信息,请参阅“反思的安全注意事项”。能够做到这一点。

是的,它确实违反了规则。如果有人这样做,我几乎不会在评论期间传递代码。

使用反射来调用方法是slllloooow,而不是类型安全的,并且如果底层类具有重写的私有方法,则容易中断。

总之,我同意,这是一个坏主意!

这是您从框架获得的高级功能。在生产代码中使用它来调用方法是非常不常见的,它破坏了成员隐藏的优点。

它有一些有用的地方:

  • 遗留代码测试 - 例如,假设您正在使用遗留代码,并且希望通过单元测试来覆盖它。如果您不允许更改代码并且您想测试一小部分功能,那么调用私有方法会很有用。
  • 生产代码中的黑客行为 - 我曾经遇到过第 3 方控制中的错误,在某些情况下未完成私人清理。使用私有调用我可以解决它。

框架提供此功能并没有什么问题,但在非必须的地方使用它就是错误的。

反射是.NET中一个强大的功能,但也有它的缺点。

<强>优点:

  1. 反射允许访问所有成员(包括私有成员和受保护成员),前提是您至少拥有 ReflectionPermission 安全性。 (当您的应用程序从同一驱动器访问反射的程序集而不是从Internet访问时,可以获得此权限。)

  2. 在极少数情况下,反射是执行任务的唯一方法。

  3. <强>缺点:

    1. 反射会破坏安全性(反编译程序集也是如此)。要获得应用程序代码和数据的完全安全性,您必须使用加密技术,而不仅仅依赖于私有或受保护的关键字,因为如果单独使用,可以通过反射或反编译轻松破解。

    2. 与静态引用(通常称为方法的方式)相比,反射速度慢得多并消耗更多资源。因此,除非这是解决问题的唯一方法,否则应避免反思。

    3. 示例当反射是解决问题的唯一方法时:

      1. 假设您的应用程序动态编译代码(例如,当您绘制用户在运行时提供的函数时)。在这种情况下,加载程序集和类型的唯一方法是通过反射。

      2. 您想克隆一个对象。您需要使用反射来访问其私有字段。

      3. 我希望这会有所帮助。 我应该感谢Francesco Balena先生的精美书籍“Microsoft Visual Basic 2005编程:语言”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top