2012-03-21 196 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

編輯:我已經刪除了前面的示例,因爲它不適用於委託簽名。

爲了處理特定於類型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 
    } 
} 

在回答你的問題有關處理種類繁多的T,也許上面的清理代碼清除它,如果沒有的話這就是泛型的用途 - 只要你知道你在每種情況下都期待着什麼。所以對於每一種類型,你期望你可以稱之爲:

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

xxx.RegisterResponseCallback(handler.callResponseCallback); 
+0

好吧,我在這裏困惑的是,我如何允許大量的T?我必須創建一個接口,還是有其他一些C#技術? – Bob 2012-03-21 10:37:33

+0

T在這裏可以是任何東西 - 它是一個無約束的類型參數。您可能想閱讀C#中的泛型類。 – 2012-03-21 10:44:54

+0

@Bob - 你的意思是ExpectedResponseType是未知的?換句話說,你真正的問題是如何調用一個未知類型的泛型方法?這是不可能的 - 正是泛型意在避免。 – dice 2012-03-21 11:08:07