2012-03-21 25 views
0

私は、以下のコードをアプリケーション全体に散らばっています。私は実際にそれを定型化し、それを静的クラスまたはクラスのユーティリティセットに配置したいので、この重複をすべて持たないでください。このコードをどのようにリファクタリングすることができますか?

しかし、関数の小さなビットは、私がそれをリファクタリングする方法を知らないような方法でユニークです。

private void callResponseCallback(IAsyncResult asynchronousResult) 
     { 
      try 
      { 
       HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; 
       HttpWebResponse response; 

       // End the get response operation 
       response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult); 
       Stream streamResponse = response.GetResponseStream(); 
       StreamReader streamReader = new StreamReader(streamResponse); 
       string responseData = streamReader.ReadToEnd(); 
       streamResponse.Close(); 
       streamReader.Close(); 
       response.Close(); 


       ExpectedResponseType regResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpectedResponseType>(responseData); 

       if (regResponse.ok == "0") 
       { 
        //error - handle the msg 
        //whether the user not loggin or not exist 
        Deployment.Current.Dispatcher.BeginInvoke(() => 
        { 

         MessageBox.Show(CustomErrorMessage); 

        }); 

       } 
       else 
       { 
        //check the variables unique to the ExpectedResponseType and do Stuff here;      


       } 
      } 
      catch (WebException e) 
      { 
       // Error treatment 
       // ... 

       Debug.WriteLine("error " + e); 
      } 

私はそれがどのクラスであるかもしれないように、「ExpectedResponseType」に合格するかどうかは、ほとんどの好奇心、そして可能なイベントを発射する方法を多分か(つまり、?Tに渡す方法があります) UIスレッドによって実行され、適切に処理されます。

ありがとうございました。

編集: "ExpectedResponseType"または "T"は、サーバーコールの種類ごとにクラスの大きなコレクションです。たとえば、LoginResponse、RegisterResponse、GetFilesResponse、UpdateResponse、DownloadResponseなどがあります。

答えて

1

EDIT:デリゲートの署名ではうまくいかないため、前の例は削除しました。

タイプTに固有のパラメータのチェックを処理するには、少し抽象を追加する必要があります。最もクリーンな方法は、おそらくコードをテンプレートクラスにラップして、私は、これは特定のパターンであると確信しているが、思い出すことができない、確認した1:

あなたはおそらく、クリーンアップ上記のコードは、それをクリアし、そうでない場合は、Tの多種多様な取り扱いについての質問に応じて
public class ResponseHandler<T> 
{ 
    public ResponseHandler(Action<T> typeSpecificCheckFunction) 
    { 
     this.CheckVariables = typeSpecificCheckFunction; 
    } 
    Action<T> CheckVariables; 
    public void callResponseCallback(IAsyncResult asynchronousResult) 
    { 
     // stuff 
     T regResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseData); 
     CheckVariables(response); 
     // stuff 
    } 
} 

これはジェネリックスのためのものであり、それぞれのケースで期待していることが分かっている限りです。それで、あなたが期待していたそれぞれのタイプについては、次の行に沿って何かを呼び出すでしょう:

var handler = new ResponseHandler<ExpectedResponseType>(response => 
         { 
          // code to check your response properties here 
         }); 

xxx.RegisterResponseCallback(handler.callResponseCallback); 
+0

ここで私は混乱しています。インターフェイスを作成する必要がありますか、あるいは他のC#テクニックがありますか? – Bob

+0

ここにあるTは何でも構いません。それは制約のない型のパラメータです。あなたはC#のジェネリッククラスを読みたいかもしれません。 –

+0

@Bob - ExpectedResponseTypeが不明であることを意味しますか?言い換えればあなたの本当の疑問は、タイプが未知のジェネリックメソッドを呼び出す方法です。それは不可能です - それはジェネリックが避けようとしているものです。 – dice

関連する問題