对扩展方法的理解我想:就是给已有程序添加方法,但是这个由三个约束
1、必须是静态类
2、必须是静态fangfa
3、方法中的第一个参数类型中必须有this关键字
namespace 扩展方法 { class Program { static void Main(string[] args) { (new User() { Name = "张三", Age = 23, Pay = 1234 }).ShowInfo(); } } class User { public string Name {get;set; } public int Age { get; set; } public double Pay { get; set; } public override string ToString() { return string.Format("姓名:{0},年龄:{1},工资:{2}",Name,Age,Pay); } } /// <summary> /// 扩展方法三要素:静态类、静态方法、this 关键字 /// </summary> static class Display { public static void ShowInfo(this object s) { Console.WriteLine(s.ToString()); Console.ReadLine(); } } }
再看看下面的一个例子
//using System.Collections.Generic; namespace System.Collections.Generic//这样写就不用在其他文件中添加命名空间了 { /// <summary> /// 这是在覆写FindAll委托方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="i"></param> /// <returns></returns> public delegate bool IsMyOrder<T>(T i); public static class MyExten { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list">泛型类对象</param> /// <param name="del">泛型委托</param> /// <returns></returns> public static List<T> MyFirstExten<T>(this List<T> list,IsMyOrder<T> del) { List<T> result = new List<T>(); foreach (var item in list) { if (del(item)) { result.Add(item); } } return result; } } }
static void Main(string[] args) { List<string> list = new List<string> { "1", "2", "3", "4", "5" }; var temp = list.MyFirstExten(MyOrder); //微软封装好的方法 //var temp = list.FindAll(a => int.Parse(a) >= 2); foreach (var item in temp) { Console.WriteLine(item); } Console.ReadKey(); } static bool MyOrder(string str) { if (int.Parse(str) >= 2) { return true; } return false; }
list.MyFirstExten(MyOrder);这句代码其实传递了两个参数,public static List<T> MyFirstExten<T>(this List<T> list,IsMyOrder<T> del)
list代表了当前类的实例,T:String,对应的委托参数也必须是string类型