問題

私は同じパターンでいくつかのロギングを必要とする多くのメソッドを持っています。いくつかのメソッドはいくつかの値を返す必要があります。私はすべてのロジックをコピーするのを避けるためにActionパラメータを持つメソッドを作成しました。それは次のようになります:

 private void Execute(Action action)
{
   Logger.Start();
   try
   {
      action();
   }
   catch(Exception exception)
   {
      Logger.WriteException();
      throw;
   }
   finally
   {
       Logger.Finish();
   }
}
 

今私はそのようないくつかの呼び出しを持っている

 public void DoSomething(string parameter)
{
    Execute(() => GetProvider(parameter).DoSomething());
}
 

しかし、値を返す関数が必要です。それを行う最善の方法は何ですか? 私は今2つを見つけました:

1)FuncでExecuteメソッドのコピーを作成する

 private T Execute<T>(Func<T> action)
{
   Logger.Start();
   try
   {
      return action();
   }
   catch(Exception exception)
   {
      Logger.WriteException();
      throw;
   }
   finally
   {
       Logger.Finish();
   }
}
 

このメソッドは動作しますが、コピーペーストもあります。

2)パラメータをアクションにする:

 public Result DoSomething(string parameter)
{
    Result result = null;
    Execute(() => result = GetProvider(parameter).DoSomething());
    return result;
}
 

これはコピーペーストを必要としませんが、それほど素敵ではありません。

これらのメソッドのいずれかを避けるためにActionとFuncに参加する方法はありますか、同じ結果を達成する別の方法がありますか?

  ベストアンサー

3番目のオプションはまだExecuteをオーバーロードすることですが、ActionバージョンをFuncバージョンで動作させます。

 private void Execute(Action action)
{
    // We just ignore the return value here
    Execute(() => { 
        action();
        return 0; 
    });
}
 

もちろん、voidが "実際の"タイプ(F#et alのUnitのような)のようなものであれば、これはすべて簡単です。TaskTask<T>の代わりにTask<T>を持つこともできます。

  同じタグがついた質問を見る

c#.netdelegatesactionfunc