我有一个场景,我使用castle动态代理能够拦截和记录对任何给定类(让我们称之为目标类)的消息调用。我通过将目标类包装在一个类中来实现这一点,该类创建了一个类的代理,并带有一个拦截器,该拦截器记录对目标类的所有方法调用。这很好。唯一的问题是,要使其工作,目标类上的所有公共方法都需要是虚拟的,出于更多原因,这是不可取的。
我可以创建一个解决方案,当我创建代理并抛出异常时,我验证所有方法都是虚拟的,但我宁愿在生成代理之前使用反射(或其他东西)将方法更改为虚拟。这样我就可以在所有类上使用,而不需要注意它是否有虚拟方法。
我在这里错过了什么,我能以某种方式存档吗?
不能通过反射来改变方法是否为虚方法。实际上,您不能用反射改变任何东西,它是类型结构的只读接口(应该是这样)。
您最好的选择是为类创建一个接口,更新对它的引用以使用该接口,并根据该接口构建代理。这样你的类就不必有虚方法了,但是你的代理会实现接口,拦截器也会工作。
您可以使用Mono Cecil。
如果不控制用于生成程序集的代码,则此方法实际上是唯一的选择。