はい、これは可能です。C# 3.5 では、Action
andFunc<T>
型のサポートが追加されました。Action は値を返さず、Func は常に値を返します。
いくつかのパラメーターも受け入れるいくつかの異なるバージョンがあります。次のコンソール アプリケーションは、これを行う方法を説明しています。
using System;
namespace Stackoverflow
{
class Service
{
public int MyMethod() { return 42; }
public void MyMethod(string param1, bool param2) { }
public int MyMethod(object paramY) { return 42; }
}
class Program
{
static void ExecuteWithRetry(Action action)
{
try
{
action();
}
catch
{
action();
}
}
static T ExecuteWithRetry<T>(Func<T> function)
{
try
{
return function();
}
catch
{
return function();
}
}
static void Main(string[] args)
{
Service s = new Service();
ExecuteWithRetry(() => s.MyMethod("a", true));
int a = ExecuteWithRetry(() => s.MyMethod(1));
int b = ExecuteWithRetry(() => s.MyMethod(true));
}
}
}
ご覧のとおり、 には 2 つのオーバーロードがありExecuteWithRetry
ます。1 つは void を返し、もう 1 つは型を返します。またはExecuteWithRetry
を渡して呼び出すことができます。Action
Func
--> 編集: 素晴らしい! 例を完成させるためのほんの少しの追加コード:
匿名関数/メソッドの場合:
ExecuteWithRetry(() =>
{
logger.Debug("test");
});
より多くのパラメーター (action、int) を使用
メソッドヘッダー:
public static void ExecuteWithRetryX(Action a, int x)
メソッド呼び出し:
ExecuteWithRetryX(() => { logger.Debug("test"); }, 2);