我有一个类,看起来像这样:

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

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

目前,在这些方法返回之前,我让前3个方法中的每一个都调用SomeSpecialMethod()。我将添加大约15个以上的方法,最终所有这些方法都需要执行SomeSpecialMethod(),并且我想知道是否存在一种方法可以说“当此类中的任何方法运行时,执行SomeSpecialMethod()”而不必显式重复执行在每个方法的末尾调用,当然可以防止SomeSpecialMethod()无限调用自身。

感谢您的建议。

最佳答案

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

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

您将需要创建一个环绕对象并拦截对其调用的拦截器。在运行时,CaSTLe将使该拦截器扩展您的具体类或实现一个通用接口(interface)-这意味着您将能够将拦截器注入(inject)到针对SomeClass的任何代码段中。
您的代码如下所示:

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

编辑

带城堡的AOP简介:http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx

拦截器(通常是AOP)通常用于诸如记录对象的每个方法调用结果或记录由任何方法引发的每个异常之类的事情。

如果SomeSpecialMethod内部的逻辑是抽象的,并且与SomeClass并不真正相关(例如,日志记录),则将逻辑移至拦截器本身可能是有意义的-但这取决于您。

关于c# - 在几个方法运行后执行一个方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20168717/

10-17 02:33