是的,这是可能的。C# 3.5 添加了对Action
和Func<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));
}
}
}
如您所见, 有两个重载ExecuteWithRetry
。一个返回 void,一个返回类型。您可以ExecuteWithRetry
通过传递一个Action
或一个来调用Func
。
--> 编辑:太棒了!只需一些额外的代码即可完成示例:
使用匿名函数/方法:
ExecuteWithRetry(() =>
{
logger.Debug("test");
});
并带有更多参数(action,int)
方法头:
public static void ExecuteWithRetryX(Action a, int x)
方法调用:
ExecuteWithRetryX(() => { logger.Debug("test"); }, 2);