我正在使用第三方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做到这一点,但我的在线研究没有给我任何完全回答我问题的东西。
非常感谢任何帮助。
答案 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 );
并不是真的提倡一种方法,但我也想分享这种方法。