我們經常通過泛型構造函數創建泛型實例,也常調用實例的擴展方法。以下的代碼在項目中隨處可見:
static void Main(string[] args){var strs = new List<string> {"hello","world"};var result = strs.Where(s => s.StartsWith("h"));foreach (var item in result){Console.WriteLine(item);}Console.ReadKey();}
以上,
● 通過泛型集合List<T>的構造函數創建了實例,內部是如何實現的呢?
● 對實例變量strs采用Where方法,我們發現Where也足夠”聰明”,因為它是針對IEnumerable集合類型的擴展方法。
.NET內部到底是如何實現的呢?不妨臨摹一下~~
創建一個類型泛型。
public class MyCute<T>{public MyCute(T t){GetCute = t;}public T GetCute { get; set; }}
在客戶端這樣調用:
static void Main(string[] args){var cuteInt = new MyCute<int>(10);var cuteStr = new MyCute<string>("hello");Console.WriteLine(cuteInt.GetCute);Console.WriteLine(cuteStr.GetCute);Console.ReadKey();}
以上,或許得到的啟示是:如果想通過構造函數創建泛型實例,需要定義一個泛型類,一個泛型類型的屬性,一個把泛型類型作為參數的構造方法。
現在想對泛型實例cuteInt和cuteStr的屬性GetCute使用擴展方法,如何做呢?
cuteInt的屬性GetCute是int類型,cuteStr的屬性GetCute是string類型,兩者的共同基類是object,那就針對object類型寫一個擴展方法。
public static class MyHelper{public static string GetStr(this object obj){return obj.ToString() + "--added string";}}
客戶端變成這樣:
static void Main(string[] args){var cuteInt = new MyCute<int>(10);var cuteStr = new MyCute<string>("hello");Console.WriteLine(cuteInt.GetCute.GetStr());Console.WriteLine(cuteStr.GetCute.GetStr());Console.ReadKey();}
總結:
● 如果針對不同類型的操作邏輯是一樣的,就可以抽象出一個泛型類。泛型類和普通類沒有本質的區別,只不過在類名稱後面多了一個占位符、或者叫類型參數,泛型類的構造函數參數是類型參數,泛型類的屬性類型也是類型參數。
● 如果針對不同類型實例的操作邏輯是一樣的,就可以針對不同實例類型的共同父類或接口寫一個擴展方法。