使用委托编写一个方法,以另一个方法作为输入参数,委托应该有未知数量的参数
本文关键字:方法 参数 输入 未知数 另一个 一个 | 更新日期: 2023-09-27 18:16:05
很抱歉,我的标题看起来有点长和混乱。让我在这里详细解释一下。在我的程序中,我有四个方法。我只是将它们的接口简化为
private static void methodA (Type1 Parameter1, Type2 Parameter2 )
private static void methodB (Type1 Parameter1, Type2 Parameter, Type3 Parameter3 )
private static Type4 methodC (Type1 Parameter1, Type2 Parameter2 )
private static Type4 methodD (Type1 Parameter1, Type2 Parameter, Type3 Parameter3 )
我想为这些方法写一个通用的重试逻辑(我不想在每个方法中添加重试)。比如
for (int retry=0; retry<retrycount; ++retry)
{
try {
run the delegate function
break;
}
catch (Exception ex) {
Thread.sleep (5000);
}
}
我想的是写另一个方法来使用函数委托作为一个输入,重试计数作为另一个输入,就像。但这四种方法签名有很大的不同。有些有输出(C,D),有些没有输出(AB)。有些有三个输入参数(B,D),有些有两个(A,C)。
我有一本非常简单的c#书,它的委托示例具有相同的签名。不确定是否可以让委托具有不同数量的输入参数至少我们可以将方法a b和方法c d组合在一起。
如果一个委托可以选择有/没有输出,我们可以将a,b,c,d组合在一起,那将会更好。
对于处理参数,您可以让重试方法接受无参数委托,然后在调用它时使用lambda。比如:
void Retry(Action action)
{
for (int retry = 0; retry < retrycount; retry++)
{
try
{
action();
break;
}
catch (Exception ex)
{
Thread.sleep (5000);
}
}
}
…
Retry(() => methodA(p1, p2));
对于返回值或没有返回值,您将不得不对Retry()
进行两个重载:一个为void
方法接受Action
,另一个为返回值的函数接受Func<T>
(并返回T
)。
这里有几个可能的方法来解决您的问题。这两种方法都允许您的delegate
方法接受可变数量的参数。
如果Type1
, Type2
和Type3
具有相同的基本类型BaseType
,则可以这样定义delegate
:
delegate Type4 Method1(params BaseType[] parameters);
或者,如果您的三个输入类型不是具有相同的基类型,您可以提供三个单独的参数,但默认第三个参数为null
:
delegate Type4 Method2(Type1 param1, Type2 param2, Type3 param3=null);
在您不关心返回类型Type4
的情况下,只需返回null
。
一旦你定义了委托,你就可以使用以下Retry
方法之一:
void Retry1(Method1 method, int retryCount)
{
}
void Retry2(Method2 method, int retryCount)
{
}