在开头和结尾调用方法 - 有没有更好的方法在 C# 中执行此操作



>我有几种具有以下结构的方法:

    public void doWhatever()
    {
     methodToPrepareEnvironment();
     // do something
     methodToResumeEnvironment();
    }

我所有的"doWhatever"类型的方法都调用这些准备/恢复方法,所有这些doAnything方法只调用了1个准备方法和1个恢复方法。有没有更好的方法来实现这一目标,而不必在我所有 doWhatever 方法的开头和结尾调用准备和恢复方法?我感觉我在这里错过了一些非常基本的东西。请注意,doAnything方法不能组合使用,它们都需要独立,并且每个都需要准备环境,执行一些任务,然后恢复环境。

谢谢。

通过战略性地使用访问修饰符,您可以确保外部调用始终在方法调用之前和之后,几乎没有重复,如下所示:

public void DoWhatever()
{
    DoAction(DoingWhatever);
}
private void DoingWhatever()
{
    // ...
}
private void DoAction(Action action)
{
    methodToPrepareEnvironment();
    action();
    methodToResumeEnvironment();
}

Action是一个委托,表示没有返回值的方法。

有没有更好的方法来实现这一目标,而不必在我所有 doWhatever 方法的开头和结尾调用准备和恢复方法?

传入委托(两个内置的委托是ActionFunc):

public void doWhatever(Action anAction )
{
 methodToPrepareEnvironment();
 anAction();
 methodToResumeEnvironment();
} 

关于确保始终调用PrepareResume - 以上不能满足这一点,因为anAction可以被任何可以访问它的代码调用。

你可以研究AOP - 一个流行的工具是PostSharp。

我会这样做,在methodToPrepareEnvironment()和methodToResumeEnvironment()之间引入一个具有要调用的函数签名的委托,然后将功能附加到委托并调用doAnything,以这种方式调用doWhatever

doWhatever(Fn); 
/////

/

public delegate void ToDO();
class Program
{
    public void Fn()
    {
        Console.WriteLine("This is Fn");
    }
    public void doWhatever(ToDO t)
    {
        methodToPrepareEnvironment();
        t();
        methodToResumeEnvironment();
    }
}

一个稍微不同的选项(虽然不像这些选项那样"干净",当然对于试图维护代码的人来说也不那么直观)是用属性标记函数,然后有一个构建步骤,在之前和之后注入方法调用:

[WrapWithEnvironmentCalls()]
public void MyFunction()
{
    // Code goes here
}

我相信CTP Rosalyn有一些功能可以解决这个问题。

警告:我永远不会在我的代码中这样做,它不可维护、直观,并且可能会在代码审查中被撕成碎片,但我只是为那些更冒险的人提供它的替代选择。

最新更新