一、基本知識
1.這三個都是.Net內置的泛型委托,方便我們直接使用,而不需要在使用委托時還要做如下定義
public delegate string GetName(string bookId);
2.Func<T>是有返回值的泛型委托,格式為Func<T1,T2,T..N,TResult>,T1,T2,T..N為多個參數,TResult為返回值
3.Ation<T>是沒有返回值的泛型委托,格式為Action<T1,T2,T..N>,T1,T2,T..N為多個參數
4.Predicate<T>是返回值為Bool的泛型委托,相當於Func<T,bool>,主要用於校驗,檢查等
二、使用理解
泛型委托的使用,和抽像類的抽象方法有異曲同工之妙,即將業務變化的實現部分抽離到外部,內部程序主體框架保持不變,做到方法注入,屬性注入
配合匿名方法的使用,可進一步使外部的實現部分也變得非常簡潔,在Linq的擴展方法有大量使用
例如:有一個判斷單號合法的方法(除了判斷,還要寫LOG,計數等),因為每種單據不同,判斷邏輯也是不一樣的,演示方法注入
//方法定義 public static bool CheckOrderNo(Func<string, bool> fun, string orderNo) { bool re = fun(orderNo); //TODO:Log //TODO:Count return re; } //使用匿名方法 //判斷是否為AA單(長度為10,首字母為"AA" var result= CheckOrderNo(x => x.Length == 10 && x.Substring(0, 2).ToUpper().Equals("AA"), "AB126552DFD15"); //判斷是否為AD單(長度為16,6~10字母為"ADGH") var result= CheckOrderNo(x => x.Length == 16 && x.Substring(5, 4).ToUpper().Equals("ADGH"), "AB126ADGH552DFD"); //使用普通做法 public bool CheckAAOrderNo(string orderNo) { return orderNo.Length == 10 && orderNo.Substring(0, 2).ToUpper().Equals("AA") } var result= CheckOrderNo(CheckAAOrderNo, "AB126552DFD15");