2017-01-23 26 views
2

私はさまざまなコンテンツを持っていますが、パラメータは同じで、内部をキャッチしようとするとほとんど同じです。冗長コードを減らすことができるように関数をラップする方法はありますか?ジェネリック関数ラッパー

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#lambda 'を検索するためにそれらを既に知っていなければ、私はあなたを招待します。 – Kilazur

1

、あなたが作るためにジェネリック医薬品の利点を取ることができます特定のケースを処理します。また、結果のタプルまたはジェネリック型を返すことは、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); 
} 
関連する問題