我有以下幾行代碼,分散在我的應用程序中。我真的很喜歡對它進行樣板化,並將其放置在靜態類或一些實用工具集中,因此我沒有這種重複。我該如何重構這段代碼?
但是,函數的小部分是唯一的,所以我不知道如何重構它。
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等。
好吧,我在這裏困惑的是,我如何允許大量的T?我必須創建一個接口,還是有其他一些C#技術? – Bob 2012-03-21 10:37:33
T在這裏可以是任何東西 - 它是一個無約束的類型參數。您可能想閱讀C#中的泛型類。 – 2012-03-21 10:44:54
@Bob - 你的意思是ExpectedResponseType是未知的?換句話說,你真正的問題是如何調用一個未知類型的泛型方法?這是不可能的 - 正是泛型意在避免。 – dice 2012-03-21 11:08:07