2015-12-23 5 views
5

で呼び出されるたびに別のメソッドを呼び出すための一般的な方法はあります。方法は私はこのような方法で何かを持っているのC#

私がいる問題は、私はsetUp()およびtearDown()メソッドの呼び出しで何度も何度もこのタイプの方法を記述する必要があることです。

EDIT:この方法のトリッキーな部分は、「有用な何かをする...」ということであるだけで、このメソッドに固有のものです。この部分は、私が作成するすべての方法で異なります。

また、MyMethod2、MyMethod3を1つのクラスに含めることができます。すべてのケースで、セットアップとティアダウンを実行したいです。

毎回これを書かなくてもうまくいく方法がありますか?

はおそらく、私は妄想だけど、メソッドに属性を追加し、メソッド呼び出しをインターセプトする方法ですので、私は、コールの前と後のものを行うことができますか?

+1

これはたくさんの質問の複製です。あなたは検索しようとしましたか?デリゲート、イベント、抽象メソッド、アスペクト指向プログラミングなどを使用できます。たとえば、[クラスのすべてのメソッドの前にメソッドを実行する](http://stackoverflow.com/questions/9192709/run-a-method-before-all-methods-of-a-class)、[Call base function then [呼び出される関数が実行される前にコードを実行する](http://stackoverflow.com/questions/10398530)、[コードブロックの前後にメソッドを実行する] ](http://stackoverflow.com/questions/26484206/)など。 – CodeCaster

+2

アスペクト指向プログラミングを使用したいと考えています。そのためのツールがたくさんあります。 –

+1

ありがとうございましたCodeCaster、私のケースで私のケースで私はあなたが異なるメソッド名、異なるパラメータ、および異なる戻り値を持つ単一のクラスでこれらの "MyMethods"の多くを持つことができますので、 – Steven

答えて

2

ですgenerics,lambdasおよびdelegatesを次のように使用します。

public SomeThing MyMethod() 
{ 
    return Execute(() => 
    { 
     return new SomeThing(); 
    }); 
} 


public T Execute<T>(Func<T> func) 
{ 
    if (func == null) 
     throw new ArgumentNullException("func"); 

    try 
    { 
     Setup(); 

     return func(); 
    } 
    finally 
    { 
     TearDown(); 
    } 
} 
+0

これはおそらく私が思っていたものに最も近いものですが、主なポイントはセットアップ/ティアダウンを繰り返し書き込む必要がなくなったことです。このコードはそれを削除しますが、追加のコードレイヤーを追加します。 – Steven

+0

この問題を解決するために属性を使用する場合は、AOPフレームワークを参照する必要があります。 –

6

ただ、このような抽象基底クラスでこのメソッドを実装します。

public Something MyMethod() 
{ 
    Setup(); 

    DoSomethingUsefull(); 

    TearDown(); 

    return something; 
} 

protected abstract DoSomethingUsefull(); 

今、あなたは継承されたクラスで唯一のメソッドオーバーライドする必要がある - DoSomethingUsefullを()

を。これは、テンプレートメソッドパターン

+2

テンプレートパターン - 非常に良い。 – dbugger

+0

はい、そうです - テンプレートパターン –

+3

通常、私は 'DoSomethingUseful'を同様のケースで保護します。 – pmbanka

関連する問題