扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。这是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,这是拓展方法的标识。如果方法里面还要传入其他参数,可以在后面追加参数;