Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在几个方法运行后执行一个方法_C# - Fatal编程技术网

C# 在几个方法运行后执行一个方法

C# 在几个方法运行后执行一个方法,c#,C#,我有一个类似这样的类: public class SomeClass { public void SomeMethod1() { ... } public void SomeMethod2() { ... } public void SomeMethod3() { ... } private void SomeSpecialMethod(SomeParameter) { ... } } public class Interceptor : IInterceptor {

我有一个类似这样的类:

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

   private void SomeSpecialMethod(SomeParameter) { ... }
}
public class Interceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
       invocation.Proceed();
       //add your "post execution" calls on the invocation's target
    }
}
目前,在前3个方法返回之前,我分别调用了
SomeSpecialMethod()
。我将再添加大约15个方法,这些方法最终都需要执行
SomeSpecialMethod()
,我想知道是否有一种方法可以说“当这个类中的任何方法运行时,执行
SomeSpecialMethod()
”不必在每个方法的末尾显式地重复调用,当然也可以防止
SomeSpecialMethod()
无限地调用自身


谢谢你的建议。

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

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

当然,这是一种开销,您可以使用非
void
方法来实现这一点(当然,您可以,但它会变得很难看)。

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

C#不遵循这种范式,但你可以模仿它。是一种选择,但我会选择Castle拦截器/DynamicProxy:

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

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

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

城堡AOP简介:

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


如果
SomeSpecialMethod
中的逻辑是抽象的,并且与
SomeClass
没有真正的关联(比如日志记录),那么将逻辑移到拦截器本身可能是有意义的,但这取决于您。

与调用event every方法相比,这有什么好处?两者都需要一行代码(前提是在构造函数中添加处理程序)。@jeroenvanevel Self-documentation,我猜?这个
X
类可以命名为
guarantedtocallsomespecialmethodonreturn
;我不知道AOP。我将暂时保留我的代码模式,但我会记住您的答案。