Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将方法调用及其参数传递给其他方法_C#_Optimization_Delegates - Fatal编程技术网

C# 将方法调用及其参数传递给其他方法

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);

我正在使用一个外部自动化库,其中包含一组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);
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"));