脚踏实地学C#5-扩展方法

扩展方法(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关键字

原文地址:https://www.cnblogs.com/qq0827/p/3347784.html