运行几个方法后执行一个方法

时间:2013-11-23 22:30:11

标签: c#

我有一个看起来像这样的课程:

public class SomeClass
{
   public void SomeMethod1() { ... }
   public void SomeMethod2() { ... }
   public void SomeMethod3() { ... }

   private void SomeSpecialMethod(SomeParameter) { ... }
}

目前,在这些方法返回之前,我让前3个方法中的每一个都调用SomeSpecialMethod()。我将添加大约15个方法,最终都需要执行SomeSpecialMethod(),我想知道是否有办法说明“当这个类中的任何方法运行时,执行{ {1}}“,无需在每个方法的末尾显式重复调用,当然也会阻止SomeSpecialMethod()无限地调用自己。

感谢您的建议。

2 个答案:

答案 0 :(得分:4)

您正在寻找AOP - 面向方面的编程。

C#不遵循这个范例,但你可以模仿它。 PostSharp是一种选择,但我会使用Castle拦截器/ DynamicProxy:http://docs.castleproject.org/Windsor.Interceptors.ashx

您需要创建一个包围对象的拦截器并拦截对它的调用。在运行时,Castle将使此拦截器扩展您的具体类或实现一个通用接口 - 这意味着您将能够将拦截器注入任何针对SomeClass的代码片段。 您的代码看起来像这样:

public class Interceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
       invocation.Proceed();
       //add your "post execution" calls on the invocation's target
    }
}

修改

使用Castle进行AOP简介:http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx

拦截器和AOP通常用于记录对象的每个方法调用的结果,或记录任何方法抛出的每个异常。

如果SomeSpecialMethod中的逻辑是抽象的并且与SomeClass没有关系(例如,像日志记录),那么将逻辑移动到拦截器本身可能是有意义的 - 但这取决于你

答案 1 :(得分:1)

我曾经遇到过这样的问题并且像这样解决了:声明了一个辅助的嵌套类(比如X),没有任何字段/方法,只有一个构造函数接受SomeClass的对象称其为SomeSpecialMethod()。然后使所有SomeClass的方法返回X

public X SomeMethod1() { 
     ... 
     return new X(this);
}

当然,有一个开销,你可以使用非void方法(好吧,你可以,但它会变丑)。