0

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

TypeAService, TypeARequest, TypeAResponse

TypeBService, TypeBRequest, TypeBResponse

等等

调用的模式始终相同,例如:

myTypeXResponse = myTypeXService.SubmitRequest(myTypeXRequest);

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

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

我尝试让函数获取并返回对象,但为了传递一个函数,我需要具体说明函数的签名,而我在这里无法做到这一点。我觉得有一些方法可以用泛型来做到这一点,但我的在线研究并没有给我任何完全回答我问题的东西。

任何帮助是极大的赞赏。

4

2 回答 2

1

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

public static T myWrapperFunction<T>(Func<T, T> func, T request)
    //where T : //some common base type, if it helps
{
    return func(request);
}
于 2013-08-21T14:39:31.463 回答
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 );

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

于 2014-05-28T22:49:57.450 回答