包含类似但不相同签名的函数的包装器

时间:2013-08-21 14:35:53

标签: c# function generics wrapper

我正在使用第三方API,它有许多不同但相似的HTTP相关对象,例如:

TypeAService, TypeARequest, TypeAResponse

TypeBService, TypeBRequest, TypeBResponse

呼叫的模式总是相同的,例如:

myTypeXResponse = myTypeXService.SubmitRequest(myTypeXRequest);

我需要将这一行包含在一些基本代码中,这些代码通过后退和重试来处理特定的TypeXServiceException以及一些其他细节,大约10到20行代码,我必须一遍又一遍地输入。我正在寻找一些优雅的方法来将这行代码包装在一个函数中,我可以通过指定应调用的方法和预期的异常类型来调用,如:

myTypeXResponse = myWrapperFunction(myTypeXService.SubmitRequest, myTypeXRequest, typeof(TypeXServiceException));

我尝试使用函数take并返回Objects但是为了传递一个函数,我需要具体说明函数的签名,这是我不能在这里做的。我觉得有一些方法可以用Generics做到这一点,但我的在线研究没有给我任何完全回答我问题的东西。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用泛型来处理此问题:

public static T myWrapperFunction<T>(Func<T, T> func, T request)
    //where T : //some common base type, if it helps
{
    return func(request);
}

答案 1 :(得分:0)

Servy对这个问题提出的方法(我上次评论中的修订版)已经运行了一段时间,但我最近用不同的方法解决了类似的问题,使用委托而不是泛型。我会在这里发布,以防其他任何人从代码中受益:

public delegate bool TryAgainAfterException(Exception ex);

public void RepeatAction(Action action, TryAgainAfterException tryAgainFunction)
{
   // set up whatever logic you would use for your do-while loop here
   bool tryAgain;

   do
   {
      tryAgain = false;
      try
      {
         action();
      }
      catch (Exception ex)
      {
         if (tryAgainFunction(ex))
         {
            // the specific logic of the Exception
            // handling would go here, including:
            tryAgain = true;
         }
         else
            throw ex;
      }
   }
   while (tryAgain);
}

现在我可以通过将调用包装在Action:

中来获取我的响应对象
RepeatAction( () => { myTypeXResponse = myTypeXService.SubmitRequest(myTypeXRequest); },
              e => e.GetType() == TypeXServiceException );

并不是真的提倡一种方法,但我也想分享这种方法。