[C#] 泛型 - A01_Generics

泛型 - 就是程式碼T來T去的東西

前言

基本泛型知識 請先看
[食譜好菜] 能不能講一下什麼是泛型(Generics)?
MSDN - 泛型 (C# 程式設計手冊)​

程式碼情境介紹一

先在應該常常會用到將json反序列化為物件的時候
程式碼 大概都長這樣
JsonConvert.DeserializeObject(json);

在考慮到轉失敗時的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資料夾

如果內容有誤請多鞭策謝謝