2017-08-10 39 views
1

私はExecuteAsyncServiceRequestというメソッドをオーバーロードしていますが、両方のメソッドの本体が似ていることがわかります。私は自分自身が、これらのメソッドを書くためのより簡潔な方法があるのだろうと思っています。具体的には、メソッド本体で自分自身を繰り返す必要はありません。類似の本体を持つ一般的で非汎用的なメソッド

ありがとうございます! voidタイプではないこと、具体的 -

/// <summary> 
    /// Executes an async service request which returns a response of type TResponse 
    /// </summary> 
    /// <param name="execute">The service request to execute</param> 
    /// <param name="success">Callback when the service request is successful</param> 
    /// <param name="failure">Callback when the service request fails</param> 
    /// <typeparam name="TResponse">Type of the expected ServiceResult returned from the async request</typeparam> 
    protected async void ExecuteAsyncServiceRequest<TResponse>(Func<Task<ServiceResult<TResponse>>> execute, 
                  Action<TResponse> success, 
                  Action<string> failure) 
    { 
     ServiceResult<TResponse> result = await execute(); 

     if (result.ResultCode == ServiceResult.ServiceResultCode.Failed) 
      failure(result.FailureDetails); 

     success(result.Response);  
    } 

    /// <summary> 
    /// Executes an async service request 
    /// </summary> 
    /// <param name="execute">The service request to execute</param> 
    /// <param name="success">Callback when the service request is successful</param> 
    /// <param name="failure">Callback when the service request fails</param>  
    protected async void ExecuteAsyncServiceRequest(Func<Task<ServiceResult>> execute, 
                Action success, 
                Action <string> failure) 
    { 
     ServiceResult result = await execute(); 

     if (result.ResultCode == ServiceResult.ServiceResultCode.Failed) 
      failure(result.FailureDetails); 

     success(); 
    } 
+0

お試しいただいた内容やうまくいかないことの説明を記入してください。 – SneakyTactician

+0

@SneakyTacticianコードはうまくいきますが、私は自分自身で「どのように最適化しますか?それを最適化できますか?」という質問をしました。たぶん答えは単に「いいえ」なのでしょうか? –

+0

ServiceResultとTResponseが同じクラスから継承する場合、または同じインタフェースを使用する場合は、これらのメソッドを総称して組み合わせることができます。もしそうでなければ、ステファンの答えを見てください。 – SneakyTactician

答えて

1

号残念ながら、これは、.NET自体の型システムの制限です。

(古典的なOOPとは対照的に)より多くの機能的影響力を持つ言語は、voidの概念を持たない傾向があります。代わりに、単一の値を持つ特別なタイプ(通常unit)が存在します。このような何か:

public sealed class Unit { 
    private Unit() { } 
    public static Unit Instance { get; } = new Unit(); 
} 

あなたはあなたのコードと似た何かを行うことができますが、それはそれは価値がそれですかどうかはあなた次第です:これはServiceResult<T>を想定している

protected async void ExecuteAsyncServiceRequest(Func<Task<ServiceResult>> execute, 
               Action success, 
               Action <string> failure) => 
    ExecuteAsyncServiceRequest(
     async() => new ServiceResult<Unit>(await execute(), Unit.Instance), 
     _ => success(), 
     failure); 

(おそらくinternal)を持つことができますServiceResultを引数とし、2番目のコンストラクタパラメータからコピーされた実際の "result"を除くすべてのプロパティをコピーします。

+0

偉大なスタッフの紳士、両方に感謝! –

関連する問題