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

3

我有一个场景,使用Castle Dynamic Proxy能够拦截和记录对任何给定类(我们称之为目标类)的消息调用。我通过将目标类包装在一个类中来实现这一点,该类创建具有拦截器的类的代理,以记录所有对目标类的方法调用。

这个方法很好用。唯一的问题是,为了使它起作用,目标类上的所有公共方法都需要是虚方法,这在更多情况下是不可取的。

我可以创建一个解决方案,在创建代理时验证所有方法是否是虚方法,如果不是,则抛出异常,但我更希望能够在生成代理之前使用反射(或其他方法)将方法更改为虚方法。这样,我就可以在所有类上使用它,而不必注意它是否具有虚方法。

我在这里错过了什么,我怎样才能做到这一点?

2个回答

4

使用反射无法改变方法是否是虚方法。实际上,你不能使用反射来修改任何东西,因为它只是一个只读接口,用于访问类型结构(正如应该那样)。

最佳方法是为类创建一个接口,更新引用以使用该接口,并基于接口构建代理。然后您的类就不必具有虚方法,但是您的代理将实现该接口,并且拦截器将正常工作。


啊!这是一个很好的答案。但是我已经创建了我的包装器,所以它可以仅记录调用,或者通过调用invocation.proceed()来记录调用并进行实际调用,这种方法是否可行? - iCediCe
是的,据我所知,用这种方法应该可以很好地解决问题。 - Erik
太棒了。这将是解决方案。谢谢您的快速回答! - iCediCe

1
你可以使用 Mono Cecil 来完成这个任务。
如果你没有控制生成程序集的代码,那么这种方法实际上是唯一的选择。

我采用了界面解决方案,但这个也很有趣。以后可能会派上用场。谢谢。 - iCediCe
1
如果您能提供一个小的示例而不是仅仅提供链接,那就太好了。无论如何,感谢您的帮助。 - T.Todua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接