2

次の構造を持ついくつかのメソッドがあります。

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

私のすべての「doWhatever」タイプのメソッドは、これらの準備/再開メソッドを呼び出します。これらすべての doWhatever メソッドによって呼び出される準備メソッドと再開メソッドは 1 つだけです。すべての doWhatever メソッドの最初と最後に準備および再開メソッドを呼び出すことなく、これを達成するためのより良い方法はありますか? ここで非常に基本的な何かが欠けていると感じています。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 メソッドの最初と最後に準備および再開メソッドを呼び出すことなく、これを達成するためのより良い方法はありますか?

デリゲートを渡します (2 つの組み込みのものはActionFuncです):

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

 anAction();

 methodToResumeEnvironment();
} 

PrepareResume常に呼び出されるようにすることに関しては、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 に答える