C# 将方法调用及其参数传递给其他方法
我正在使用一个外部自动化库,其中包含一组API,这些API具有1个或2个参数,这些参数会随机抛出TargetException。第二次或第三次调用这些API通常是有效的。因此,我创建了两个helper方法来封装多重重试逻辑C# 将方法调用及其参数传递给其他方法,c#,optimization,delegates,C#,Optimization,Delegates,我正在使用一个外部自动化库,其中包含一组API,这些API具有1个或2个参数,这些参数会随机抛出TargetException。第二次或第三次调用这些API通常是有效的。因此,我创建了两个helper方法来封装多重重试逻辑 //Original API calls bool result1 = Foo1(true); int result2 = Foo2(4, "abc"); //New API calls bool result1 = SafeMethodCall(Foo1, true);
//Original API calls
bool result1 = Foo1(true);
int result2 = Foo2(4, "abc");
//New API calls
bool result1 = SafeMethodCall(Foo1, true);
int result2 = SafeMethodCall(Foo2, 4, "abc");
//Helper Methods
public static TResult SafeMethodCall<T, TResult>(
Func<T, TResult> unSafeMethod,
T parameter)
{
int numberOfMethodInvocationAttempts = 3;
int sleepIntervalBetweenMethodInvocations = 10000;
for (int i = 0; i < numberOfMethodInvocationAttempts; i++)
{
try
{
return unSafeMethod(parameter);
}
catch (System.Reflection.TargetInvocationException ex)
{
System.Threading.Thread.Sleep(sleepIntervalBetweenMethodInvocations);
}
}
}
public static TResult SafeTargetInvocationMethodCall<T1, T2, TResult>(
Func<T1, T2, TResult> unSafeMethod,
T1 parameter1,
T2 parameter2)
{
int numberOfMethodInvocationAttempts = 3;
int sleepIntervalBetweenMethodInvocations = 10000;
for (int i = 0; i < numberOfMethodInvocationAttempts; i++)
{
try
{
return unSafeMethod(parameter1, parameter2);
}
catch (System.Reflection.TargetInvocationException ex)
{
System.Threading.Thread.Sleep(sleepIntervalBetweenMethodInvocations);
}
}
}
//原始API调用
bool result1=Foo1(真);
int result2=Foo2(4,“abc”);
//新的API调用
bool result1=SafeMethodCall(Foo1,true);
int result2=SafeMethodCall(Foo2,4,“abc”);
//辅助方法
公共静态TResult SafeMethodCall(
Func非女性方法,
T参数)
{
int numberOfMethodInvocationAttempts=3;
int SleepIntervalbetween方法职业=10000;
for(int i=0;i
问题:如果您看到上面的两个helper方法具有相同的主体,唯一的区别是try块内的unsafeMethod调用。在这里,我如何避免代码重复,因为我可能必须添加一个接受
Func
作为另一个参数类型。只需传入Func
并如下调用它:
bool result1 = SafeMethodCall(() => Foo1(true));
int result2 = SafeMethodCall(() => Foo2(4, "abc"));
换句话说,将参数封装在委托本身中。谢谢,效果非常好!我仍在努力说服代表们。你能推荐一些关于lambdas和delegate的实际用法而不仅仅是理论的书籍或链接吗?一些与我的问题类似的情况?@Anunay:恐怕不是,真的。。。我自己的书(C#深入)确实谈到了很多关于代表的问题,但不是特别针对这种情况。
bool result1 = SafeMethodCall(() => Foo1(true));
int result2 = SafeMethodCall(() => Foo2(4, "abc"));