2012-02-08 13 views
0

私は別の方法にトークンの検証を抽出しようとしています。その後、else文のコードブロックも同じようにジェネリックにしたいと考えています。AsyncMethodコールジェネリックの作成方法

public void Subscribe(string s1, string s2, string s3) 
    { 
     if (token == null || token.IsExpired) 
     {     
      RestClient client = CreateRestClient(); 
      RestRequest treq = CreateTokenRequest();     

      client.ExecuteAsync(treq, (response) => 
      { 
       CreateNewToken(response.Content); 
       SubscribeToNotifications(s1, s2, s3); 
      }); 
     } 
     else 
     { 
      var c = new RestClient(ServiceAddress); 
      var r = new RestRequest("Subscribe?"); 
      r.AddParameter("P1", s1); 
      r.AddParameter("P2", s2); 
      r.AddParameter("P3", s3); 
      r.AddHeader("Authorization", token.TokenString); 
      c.ExecuteAsync(r, (response) => 
      { 
       if (response.StatusCode == HttpStatusCode.OK) 
        SubcribeCompleted(this, new GeneralEventArgs(true, string.Empty)); 
       else if (response.StatusCode == HttpStatusCode.Unauthorized) 
        SubcribeCompleted(this, new GeneralEventArgs(false, "Unauthorized!")); 
       else 
        SubcribeCompleted(this, new GeneralEventArgs(false, "Error")); 
      }); 
     } 
    } 

問題は、コールバックハンドラでどのメソッドを呼び出すかを指定する方法です。 私はFunc<>で試しましたが、ジェネリックトークンメソッドを使用する他のメソッドは、必ずしも同じシグネチャを持つわけではありません。任意の入力:)

+0

ジェネリックで何を意味するのですか?.NETクラスを自動入力するジェネリックメソッドを使用することを意味しますか、コールバックメソッドを埋め込みではなく呼び出し元によって選択できるという点で、 – Guvante

+0

申し訳ありません。私はより具体的ではありませんでした。コールバックを呼び出し元が選択できるように、コードをより汎用的にしたいと考えています。 –

答えて

0

Action<RestResponse>事前に

おかげRestClient.ExecuteAsyncのタイプです。

Func<>戻り値がある場合は使用されないため、Action<>が使用されます。

+0

はい、私はそれを理解していますが、どのようにコールバックを実装すると、コールバックが元々そのメソッドを呼び出した人に依存していることを意味する汎用コールバックですか? –

+0

'Action '型の(3つの文字列の後に)メソッドに追加のパラメータを追加します。ラムダ式をそのパラメータで置き換えます。たとえば、 'c.ExecuteAsync(r、action);'とします。次に、 'Subscribe'を呼び出すときにラムダ式を提供します。 – Guvante