我有一个看起来像这样的课程:
public class SomeClass
{
public void SomeMethod1() { ... }
public void SomeMethod2() { ... }
public void SomeMethod3() { ... }
private void SomeSpecialMethod(SomeParameter) { ... }
}
目前,在这些方法返回之前,我让前3个方法中的每一个都调用SomeSpecialMethod()
。我将添加大约15个方法,最终都需要执行SomeSpecialMethod()
,我想知道是否有办法说明“当这个类中的任何方法运行时,执行{ {1}}“,无需在每个方法的末尾显式重复调用,当然也会阻止SomeSpecialMethod()
无限地调用自己。
感谢您的建议。
答案 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
方法(好吧,你可以,但它会变丑)。