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

时间:2015-07-23 15:55:57

标签: c# .net reflection castle-dynamicproxy

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

我可以创建一个解决方案,我在创建代理时验证所有方法都是虚拟的,如果不是这样,则抛出异常,但我宁愿是否可以使用反射将方法更改为虚拟(在生成代理之前。通过这种方式,我可以使用所有类,而无需关注它是否具有虚拟方法。

我在这里缺少什么,我能以某种方式存档吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

您可以使用Mono Cecil执行此操作。

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