2023年11月19日 星期日

[C#]泛型一些基本寫法

        平常較少機會寫到泛型(Generic),導致之前寫時生疏不順。所以趁最近有空寫這篇文章來當作複習及紀錄寫法。

        前言:泛型特點在於可延後確定參數的型別,等到呼叫或宣告時再依實際類別來決定。
依此特性可以寫出通用的類別和方法,可避免寫過多重複類似的程式碼。 

基本範例:

GenericTest<int> geInt = new GenericTest<int>();
GenericTest<double> geDou = new GenericTest<double>();

public class GenericTest<T> where T: new()  //where 泛型條件
{
    private T _value;   //內部參數
    public T number {   //設定Property來讀取內部參數
        get
        {
            return _value;
        }
        set
        {
            _value = value;
        }
    }
}

可看到類別名<泛型> 後面可加上where 來限制泛型可用的型別。(範例where條件:要有無參數建構式)
程式中也可看到型別的確定都是在宣告時才確定。

進階範例:結合List、轉型、泛型參數Function等

static T1 GetListData<T1, T2>(T2 param) where T1 : List<T2> //where條件 2個泛型的關係
{
    List<T2> result = new List<T2>();
    
    switch (typeof(T2).Name.ToUpper())  //判斷實際類型做不同處理
    {
        case "STRING":
            List<string> list1 = ReListStr(param as string);    //將泛型參數傳到實際類型的方法
            result = new List<T2>((IList<T2>)list1);    //將結果轉型為泛型結果
            break;
        case "INT32":
            List<int> list2 = ReListInt(Convert.ToInt32(param));    //將泛型參數傳到實際類型的方法
            result = new List<T2>((IList<T2>)list2);    //將結果轉型為泛型結果
            break;
    }
    return (T1)result;  //轉換
}

上面範例雖然用到兩個泛型來寫,但其實用一個也可以。
之所以寫成兩個是為了展示多個泛型的寫法,並且Where也可寫成泛型間的關係來當條件。

而Function中判斷T2類型再去呼叫不同的邏輯Fun,可看到如何將泛型參數丟到已知型別參數的方法,再將得到結果轉成泛型供Function回傳使用。



沒有留言:

張貼留言