这个问题有两个事实: 1)通过反射,可以调用私有方法。 2)TypeBuilder无法从另一个程序集构建新类型的“继承”表单内部类型。
我可以使用ECMA-335解释TypeBuilder的行为 - 如果type不是“标记为已导出”,则它是不可见的,继承需要可见性。
但我无法解释为什么反思有效?
ECMA规范使用Reflection合法化在运行时访问元数据,并提到一个应用程序 - 序列化,即对状态的访问,对字段的访问..还有句子“元数据描述如何解析调用”,但我无法在文本中找到可以忽略方法的可访问性来解决调用的情况。可能我会想念一些东西。有人可以解释我ECMA作者如何为私人方法调用打开门的方式(至少对于反思,顺便说一句,如果特定指定的话,可以忽略成员的可访问性) - 但我无法在文字,再次)?
答案 0 :(得分:2)
这里只是一个猜测,但是对于验证托管代码的类型安全性和可信赖性等内容的静态分析需要查看类类型的所有部分 - 公共接口以及私有字段。如果一个类包含一个不安全类型的私有字段,那么类本身的类型安全性就会受到质疑。
如果私有成员在反射API中不可见,则无法对类型安全进行静态分析,或者可能不完整。