>我有几种具有以下结构的方法:
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 方法的开头和结尾调用准备和恢复方法?
传入委托(两个内置的委托是Action
和Func
):
public void doWhatever(Action anAction )
{
methodToPrepareEnvironment();
anAction();
methodToResumeEnvironment();
}
关于确保始终调用Prepare
和Resume
- 以上不能满足这一点,因为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有一些功能可以解决这个问题。
警告:我永远不会在我的代码中这样做,它不可维护、直观,并且可能会在代码审查中被撕成碎片,但我只是为那些更冒险的人提供它的替代选择。