这个问题有两个事实: 1)通过反射可以调用私有(private)方法。 2) TypeBuilder 无法从另一个程序集构建新类型“继承”形式的内部类型。
我可以使用 ECMA-335 解释 TypeBuilder 的行为——如果类型没有“标记为导出”,它是不可见的,继承需要可见性。
但我无法解释为什么反射有效?
ECMA 规范使用反射在运行时合法访问元数据,并提到了一个应用程序 - 序列化,这意味着访问状态,字段。还有一句“元数据描述如何解析调用”,但我在文本中找不到可以忽略方法的可访问性来解决调用的情况。可能我错过了什么。有人能给我解释一下 ECMA 作者是如何为私有(private)方法调用敞开大门的吗(至少为了反射(reflection),顺便说一句,“如果特别指定,可以忽略成员可访问性”——但我在文本,再次)?
最佳答案
这里只是一个猜测,但是对于验证托管代码的类型安全和可信度等事情的静态分析需要查看类类型的所有部分——公共(public)接口(interface)和私有(private)字段。如果一个类包含一个不安全类型的私有(private)字段,那么这个类本身的类型安全就有问题了。
如果私有(private)成员在反射 API 中不可见,则类型安全的静态分析将不可能进行,或者会非常不完整。
关于.net - 为什么反射有效(ECMA-335 调用私有(private)方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4252092/