使用 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
希望此篇文章可以幫助到需要的人
若內容有誤或有其他建議請不吝留言給筆者喔 !