使用反射更改方法访问修饰符

Changing method access modifier with reflection

我有一个场景,我使用城堡动态代理来拦截和记录对任何给定 class(我们称之为目标 class)的消息调用。我通过将 target-class 包装在 class 中来实现这一点,该 class 创建 class 的代理,并使用一个拦截器记录对 target-class 的所有方法调用。 这很好用。唯一的问题是,要使 target-class 上的所有 public 方法工作,都需要是虚拟的,出于更多原因,这是不可取的。

我可以创建一个解决方案,在创建代理时验证所有方法都是虚拟的,如果不是这种情况则抛出异常,但我宁愿可以使用以下方法将方法更改为虚拟在生成代理之前反射(或其他东西)。这样我就可以在所有 classes 上使用而无需注意它是否具有虚拟方法。

我在这里遗漏了什么,我能以某种方式存档吗?

您不能通过使用反射来改变方法是否为虚方法。实际上,你根本不能用反射改变任何东西,它是你的类型结构的只读接口(它应该是)。

您最好的选择是为 class 创建一个接口,更新对它的引用以使用该接口并从该接口构建代理。然后你的 class 不必有虚拟方法,但你的代理将实现接口并且拦截器将工作。

您可以使用 Mono Cecil 来做到这一点。

如果您不控制用于生成程序集的代码,则此方法确实是唯一的选择。