【问题标题】:Changing method access modifier with reflection使用反射更改方法访问修饰符
【发布时间】:2015-10-14 01:22:50
【问题描述】:

我有一个场景,我使用城堡动态代理来拦截和记录对任何给定类的消息调用(我们称之为目标类)。我通过将目标类包装在一个类中来做到这一点,该类使用一个拦截器创建该类的代理,该拦截器记录对目标类的所有方法调用。 这工作正常。唯一的问题是,为此,目标类上的所有公共方法都必须是虚拟的,这出于更多原因是不可取的。

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

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

【问题讨论】:

    标签: c# .net reflection castle-dynamicproxy


    【解决方案1】:

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

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

    【讨论】:

    • 啊!这是一个很好的答案。但是我制作了我的包装器,因此可以只记录调用,也可以记录调用并通过调用 invocation.proceed() 进行实际调用,这种方法可以实现吗?
    • 是的,据我了解,这种方法应该可以正常工作。
    • 太棒了。这将是解决方案。感谢您的快速答复!
    【解决方案2】:

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

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

    【讨论】:

    • 我选择了接口解决方案,但这很有趣。这可能会在某个时候派上用场。谢谢。
    • 如果你写一个小例子会很好,而不是仅链接。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 2010-09-10
    • 1970-01-01
    • 2015-09-16
    • 2012-10-22
    • 2015-11-27
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多