[C#] 使用 Convert.ChangeType() 方法來轉換物件為泛型(Generic)型別

使用 Convert.ChangeType() 方法來轉換物件為泛型(Generic)型態

前言

 

在實作泛型類別(方法)時,當需要將指定物件資料轉換成泛型型別時,可以使用 Convert.ChangeType() 方法來做處理;以下就一個簡單實例作為範例,有興趣的朋友可以參考一下。

 

 

實例說明

 

筆者想要將呼叫Web API相關邏輯封裝成WebApiAgent<T1, T2>泛型類別工具,好讓相同程式碼不再專案中重複地出現;其中T1表示欲送出的資料類別,而T2則表示預期接收到的資料類別,因此我們就可以透過泛型型別參數T1與T2來處理不同類別之JSON序列化(Serialize)及反序列化(Deserialize)工作,並透過POST方法送出資料及取得強型別Response資訊,示意代碼如下。

 

public class WebApiAgent<T1, T2>
{ 
   // Fields
   private string _uri;

   private T1 _request;

   private HttpClient _client;


   // Constructors
   public WebApiAgent(string uri, T1 request)
   {
       this._uri = uri;
       this._request = request;
       this._client = new HttpClient();
   }


   // Methods
   public async Task<T2> Post()
   {
       // serialize request object
       var content = SerializeRequestObj(_request);

       // post
       HttpResponseMessage response = await _client.PostAsync(_uri, content);

       // get response
       response.EnsureSuccessStatusCode();
       string responseBody = await response.Content.ReadAsStringAsync();

       // deserialize response
       return DeserializeResponse(responseBody);

   }

   private StringContent SerializeRequestObj(T1 inputModel)
   {
       var jsonstr = (typeof(T1) == typeof(string)) 
						?inputModel.ToString()
						:JsonConvert.SerializeObject(inputModel);
						
       return new StringContent(jsonstr, Encoding.UTF8, "application/json");
   }
   
   private T2 DeserializeResponse(string response)
   {
       // ...
   }
}

 

在 DeserializeResponse 方法中,主要就是將response字串資訊反序列化為T2泛型型別;當T2(接收資料類別)為字串型別時,其實並不需要執行反序列化動作,但此時又不能直接將字串回傳出去,因為型態不相符(雖然其實此時的T2就是字串類別),而這時就可以用 Convert.ChangeType() 來轉換物件為泛型型別。

 

private T2 DeserializeResponse(string response)
{
  return (typeof(T2) == typeof(string)) 
          ? (T2)Convert.ChangeType(response, typeof(T2))
          : JsonConvert.DeserializeObject<T2>(response);
}

 

 

參考資訊

 

http://melick-rajee.blogspot.tw/2011/10/generic-type-convert-in-c.html


希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !