2017-01-23 151 views
2

我有许多不同内容的函数,但参数和try catch里面差不多。无论如何要将功能封装起来以便减少冗余代码。通用函数包装

ResponseStatus GetPotatoList(GetPotatosRequest requestParam, out GetPotatosResponse response, out ResponseErrorType errorType) 
{ 
    ResponseStatus status = ResponseStatus.Fail; 
    response = new GetPotatosResponse(); 

    //To Do 

    try 
    { 

     //To Do 

     status = ResponseStatus.Success; 
    } 
    catch(CustomException ex) 
    { 
     errorType = ResponseErrorType.CustomError; 
    } 
    catch(TimeoutException ex) 
    { 
     errorType = ResponseErrorType.Timeout; 
    } 
    catch(Exception ex) 
    { 
     errorType = ResponseErrorType.GeneralFailure; 
    } 

    return status; 
} 

回答

6

您可以将Action传递给您的方法。

ResponseStatus GetPotatoList(Action action1, Action action2, GetPotatosRequest requestParam, out GetPotatosResponse response, out ResponseErrorType errorType) 
{ 
    ResponseStatus status = ResponseStatus.Fail; 
    response = new GetPotatosResponse(); 

    action1(); 

    try 
    { 
     action2(); 
     status = ResponseStatus.Success; 
    } 
    catch(CustomException ex) 
    { 
     errorType = ResponseErrorType.CustomError; 
    } 
    catch(TimeoutException ex) 
    { 
     errorType = ResponseErrorType.Timeout; 
    } 
    catch(Exception ex) 
    { 
     errorType = ResponseErrorType.GeneralFailure; 
    } 

    return status; 
} 

然后使用它:

var response = GetPotatoList(
    () => doSomething(), 
    () => doSomethingElse(), 
    requestParam, 
    out response, 
    out errorType); 
+0

是否有可能访问action1()和action2()内部的值? –

+0

@Amigo你为什么需要它?例如,如果你需要传递参数,你可以使用类型化的Action:'Action ',你可以像这样设置:'(myInt)=> doSomething(myInt)'并且像这样使用它:'action1(213 );';我邀请你,如果你不知道他们已经搜索了'C#lambdas'来理解它是如何工作的。 – Kilazur

1

不使用动作,你也许应该使用,将采取请求的参数和返回的响应对象的功能,那么你可以采取仿制药的好处,使该调用然后处理特定情况。同样返回元组或Result的某个泛型类型可能是一个好主意,而不是使用out参数。

public static Tuple<TResponse, ResponseStatus, ResponseErrorType> GetResponse<TRequest, TResponse>(Func<TRequest, TResponse> action, TRequest request) 
{ 
    var status = ResponseStatus.Fail; 
    var errorType = ResponseErrorType.None; 
    var response = default(TResponse); 

    try 
    { 
     response = action(request); 
     status = ResponseStatus.Success; 
    } 
    catch (CustomException ex) 
    { 
     errorType = ResponseErrorType.CustomError; 
    } 
    catch (TimeoutException ex) 
    { 
     errorType = ResponseErrorType.Timeout; 
    } 
    catch (Exception ex) 
    { 
     errorType = ResponseErrorType.GeneralFailure; 
    } 

    return new Tuple<TResponse, ResponseStatus, ResponseErrorType>(response, status, errorType); 
}