●扩展方法

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。这是msdn官网对扩展方法的描述。

举个例子:

    static void Main(string[] args)
    {
        DateTime now = DateTime.Now;
        string time = now.ToString("yyyy-MM-dd HH:mm:ss");
        Console.WriteLine(time);
    }

      假设需求变了,日期格式要改成”yyyy-MM-dd”,当然只需要初始化time时按下面的写法改就可以:

        string time = now.ToString("yyyy-MM-dd");

    但是如果要改变的日期格式有多个类呢,每个都改一次么?这样一旦需求变来变去,就忙死人了。传统的方法是封装一个帮助类,在里面写方法,然后其他类调用。

    public class DateHelper
    {
        public static string DateToString(DateTime dt)
        {
            return dt.ToString("yyyy-MM-dd HH:mm:ss");
        }
    }

    这样要调用另一个类的方法,还是有点麻烦,有没有什么方法能够让我们像now.ToString()一样直接调用呢?微软写好的,我们改不了,于是便引出了扩展方法。

我们把DateHelper类改成静态类,同时改写DateToStrin()方法

    public static class DateHelper
    {
        public static string DateToString(this DateTime dt)
        {
            return dt.ToString("yyyy-MM-dd HH:mm:ss");
        }
    }

    此时回到主函数,输入“now.”就可以看见自动提示有个DateToString()方法,于是代码可以这样写:

    static void Main(string[] args)
    {
        DateTime now = DateTime.Now;
        string time = now.DateToString();
        Console.WriteLine(time);
    }

多个参数:

    public static class DateHelper
    {
        /// <summary>
        /// 此时间是否在此范围内 -1:小于开始时间 0:在开始与结束时间范围内 1:已超出结束时间
        /// </summary>
        /// <param name="t"></param>
        /// <param name="startTime"></param>
        /// <param name="endTime"></param>
        /// <returns></returns>
        public static int IsRange(this DateTime t, DateTime startTime, DateTime endTime)
        {
            if (((startTime - t).TotalSeconds > 0))
            {
                return -1;
            }

            if (((endTime - t).TotalSeconds < 0))
            {
                return 1;
            }

            return 0;
        }
    }

可以这样调用:time.IsRange(t1,t2); //判断时间time是否在t1到t2的范围内

使用扩展方法需要注意:

1、此方法必须是一个静态方法,同时必须放在静态类中;

2、扩展方法不能和调用的方法放在同一个类中;

3、第一个参数必须要,并且必须是this,这是拓展方法的标识。如果方法里面还要传入其他参数,可以在后面追加参数;

原文地址:https://www.cnblogs.com/phantom-k/p/6594610.html