C#:在其他方法中包装方法

时间:2011-02-01 21:28:32

标签: c# perl moose aop

有没有办法在C#中透明地包装其他方法中的方法?我想实现Moose围绕功能所做的工作:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiers

编辑:透明,我的意思是不修改原始方法。

5 个答案:

答案 0 :(得分:4)

我认为你正在寻找所谓的面向方面编程。有许多C#库可以帮助解决这个问题。一个叫PostSharp(PostSharp的免费版本支持此功能)。这是一个类似于驼鹿示例的示例。这将创建一个Trace属性,您可以在其他方法上使用它来实现这一额外功能:

[Serializable]
public class TraceAttribute : OnMethodBoundaryAspect
{

    public override void OnEntry( MethodExecutionArgs args )
    {
        Trace.WriteLine("about to call method");
    }

    public override void OnExit(MethodExecutionArgs args) 
    { 
       Trace.WriteLine("just finished calling method"); 
    }
 }

您可以通过将Trace属性放在它之前将其添加到方法“Foo”:

[Trace]
public void Foo() { /* ... */ }

现在当Foo执行时,上面的OnEntry方法将在它之前运行,而OnExit将在之后运行。

答案 1 :(得分:2)

答案 2 :(得分:2)

使用动态代理可以达到同样的效果。一个例子是Castle Dynamic Proxy

此类框架利用C#反射工具构建“代理”或“包装”类。所以记住这一点。由于这个原因,有一定的开销。或者,您可以使用create classes statically via code generation

的框架

答案 3 :(得分:0)

不,不是在Moose中完成的方式。您可能想要查看一些AOP库。

答案 4 :(得分:0)

某些隔离库实现了允许使用“detours”或mock方法替换对方法的调用的功能。您可以使用相同的功能来实现您所指的拦截。有关更多详细信息,请查看以下内容:

Rhino Mocks stubs and mocks are only good for interfaces?

http://research.microsoft.com/en-us/projects/moles/

http://www.typemock.com/typemock-isolator-product3/