2

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

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

我所有的“doWhatever”类型的方法都调用了这些准备/恢复方法,所有这些 doWhatever 方法只调用了 1 个准备和 1 个恢复方法。有没有更好的方法来实现这一点,而不必在我所有的 doWhatever 方法的开头和结尾调用 prepare 和 resume 方法?我觉得我在这里遗漏了一些非常基本的东西。请注意,doWhatever 方法不能组合,它们每个都需要独立,它们每个都需要准备环境,执行一些任务,然后恢复环境。

谢谢你。

4

4 回答 4

5

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

public void DoWhatever()
{
    DoAction(DoingWhatever);
}

private void DoingWhatever()
{
    // ...
}

private void DoAction(Action action)
{
    methodToPrepareEnvironment();

    action();

    methodToResumeEnvironment();
}

AnAction是代表没有返回值的方法的委托。

于 2012-11-19T11:41:56.097 回答
3

有没有更好的方法来实现这一点,而不必在我所有的 doWhatever 方法的开头和结尾调用 prepare 和 resume 方法?

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

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

 anAction();

 methodToResumeEnvironment();
} 

关于确保PrepareandResume总是调用 - 上面不满足这一点,因为anAction可以由任何可以访问它的代码调用。

您可以调查AOP - 一个流行的工具是PostSharp

于 2012-11-19T11:40:52.000 回答
1

我会这样做,引入一个委托,该委托具有要在 methodToPrepareEnvironment() 和 methodToResumeEnvironment() 之间调用的函数的签名,然后将函数附加到委托并以这种方式调用 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();
    }
}
于 2012-11-19T11:53:34.050 回答
1

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

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

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

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

于 2012-11-19T12:53:17.907 回答