如何拦截类的方法调用

时间:2010-08-02 02:22:19

标签: .net aop

有没有拦截类的方法调用所以你可以做AOP?

e.g。

我希望Teacher.Talk()在两种情况下的表现不同:

class School
{
    [Fun]
    public void Picnic {
        Teacher t = new Teacher();
        t.Talk();
    }

    public void Seminar{
        Teacher t = new Teacher();
        t.Talk();
    }
}

在上面的代码中,Picnic函数由Fun属性修饰,因此教师的Talk功能比没有属性修饰的Seminar函数更有趣。

我已经检查过Castle.DynamicProxy,但是它使用代理类并需要修改一些代码。这无助于解决我的问题,因为我想使用该属性来进行配置,因此当决策发生变化时,将需要很少的代码修改。

提前多多感谢!

2 个答案:

答案 0 :(得分:1)

几个月前研究了同样的问题后,我找到的唯一合适的解决方案就是使用PostSharp。 http://www.sharpcrafters.com/

即便这样也不理想,因为它在使用属性(给予或接受)的类中禁用编辑/继续。

答案 1 :(得分:1)

有两种基本方法:创建子类代理或修改代码,即“编译时编织”,以便将钩子输入到已编译的程序集中。

Subclassing只允许你拦截虚方法和构造函数,而编译时编织可以在任何地方进入钩子来拦截代码库中的调用。