扩展方法(Extension Method)
MSDN定义:能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
扩展方法须知: 1、扩展方法声明所在的类必须被声明为static
2、扩展方法必须被声明为static
3、扩展方法必须包含this关键字作为它的第一个参数类型,并后跟所扩展的类的名称
创建扩展方法
//通过扩展方法 创建一个类似List FindAll方法 namespace Blog_ExtensonMethod { //静态类 public static class ExtensionMethods { //声明一个委托(本次不是重点,后面介绍委托和事件) public delegate bool MyCalcDelegate<in T>(T obj); //静态方法 //第一版本 public static List<T> ScreenValueList<T>(this List<T> list, MyCalcDelegate<T> myCalc) //this关键字 后跟类型 { List<T> reslut = new List<T>(); foreach (var item in list) { if (myCalc(item)) { reslut.Add(item); } } return reslut; } //第二版本 public static List<T> ScreenValue<T>(this List<T> list, Func<T, bool> whereLambda) { return list.Where(whereLambda).ToList(); } } }
namespace Blog_ExtensonMethod { class Program { static void Main(string[] args) { //list初始化数据 List<int> list = new List<int>(); for (int i = 0; i < 100; i++) { list.Add(i); } //ScreenValueList(筛选数据)创建步骤 //1.创建扩展方法(静态类、静态方法、this关键字+类型) //1.1 创建一个委托(委托可以简单理解将方法像参数一样可以进行传递) //2.方法内 创建一个新的泛型List //3.方法内 将MyCalc方法(判断list中的单个值是否大于50,如果大于就添加到新的泛型List中) //4.方法内 将新的泛型List返回 //第一版本 var temp = list.ScreenValueList(MyCalc); //将MyCalc方法传入ScreenValueList方法中返回List循环打印 foreach (var item in temp) { Console.WriteLine(item); } Console.WriteLine("======================="); //第二版本 和FindAll差不多了 var tmp = list.ScreenValue(i => i > 50); foreach (var item in tmp) { Console.WriteLine(item); } Console.ReadKey(); } public static bool MyCalc(int val) { return val > 50; } } }
其实很多的时候我们都在用扩展方法,只是没认真注意,如Linq中的方法,Where、OrderBy等,犹如MVC中HtmlHelper添加符合我们方法,那绝对是堪比服务端控件的利器,而又没有viewstate!
扩展方法其实只要记得三要素:静态类、静态方法、this关键字