平常較少機會寫到泛型(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回傳使用。
沒有留言:
張貼留言