泛型 - 就是程式碼T來T去的東西
前言
基本泛型知識 請先看
[食譜好菜] 能不能講一下什麼是泛型(Generics)?
MSDN - 泛型 (C# 程式設計手冊)
程式碼情境介紹一
先在應該常常會用到將json反序列化為物件的時候
程式碼 大概都長這樣
JsonConvert.DeserializeObject
在考慮到轉失敗時的try catch 大概會變成這樣
try
{
product = JsonConvert.DeserializeObject<Product>(json);
}
catch (Exception)
{
product = new Product();
}
每換一個class就要再寫一次一樣的程式碼
這時候就可以用上泛型
程式碼會像這樣
public static T JsonToObject<T>(string json)
where T:new()
{
try
{
return JsonConvert.DeserializeObject<T>(json);
}
catch (Exception)
{
return new T();
}
}
< > 就是泛型 放在裡面的T或是U或是TKey 你開心也可以放 任何單字 (不會被念就好)
都是表示 任何型別
至於
where T:new()
就是將T約束一定要有無參數建構子的物件才可以傳進來
所以我可以用
return new T();
參考連結
MSDN - 類型參數的條件約束
程式碼情境介紹二
現在接API回傳的json 會看到這樣的格式
{
"Version": "V1",
"Data": {
"ID": 87,
"Name": "產品"
},
"ErrorCode": 0
}
Data 的資料 可能是 物件 也可能是 int 或是 陣列
ErrorCode 有時候是 int 有時候會是 有小數點的
這時候也可以用上泛型
public interface IAPIData<T,U>
where T:class
where U:struct
{
string Version { get; set; }
T Data { get; set; }
U ErrorCode { get; set; }
}
public class APIData<T,U> : IAPIData<T,U>
where T:class
where U:struct
{
public string Version { get; set; }
public T Data { get; set; }
public U ErrorCode { get; set; }
}
介面 也可以用泛型
繼承的class 一樣要實作介面 包含 約束條件喔
這樣只有要建立一個 是不是很方便呢
程式碼情境介紹三
最後把接到的json 透過 JsonToObject 就可以變成物件使用了
public static IAPIData<Product,int> Demo1(string json)
{
return JsonHelper.JsonToObject<APIData<Product, int>>(json);
}
public static IAPIData<string, float> Demo2(string json)
{
return JsonHelper.JsonToObject<APIData<string, float>>(json);
}
結語
希望由上面範例介紹 可以讓大家對於泛型
實務上可以應用的情境 更加了解
完整程式碼放在 Github了 - 請看A01_Generics資料夾
如果內容有誤請多鞭策謝謝