擴展方法使你可以向現有類型「添加」方法,而無需建立新的派生類型、從新編譯或以其餘方式修改原始類型。 擴展方法是一種特殊的靜態方法,但能夠像擴展類型上的實例方法同樣進行調用。這是msdn官網對擴展方法的描述。函數
舉個例子:this
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時按下面的寫法改就能夠:spa
string time = now.ToString("yyyy-MM-dd");
可是若是要改變的日期格式有多個類呢,每一個都改一次麼?這樣一旦需求變來變去,就忙死人了。傳統的方法是封裝一個幫助類,在裏面寫方法,而後其餘類調用。code
public class DateHelper { public static string DateToString(DateTime dt) { return dt.ToString("yyyy-MM-dd HH:mm:ss"); } }
這樣要調用另外一個類的方法,仍是有點麻煩,有沒有什麼方法可以讓咱們像now.ToString()同樣直接調用呢?微軟寫好的,咱們改不了,因而便引出了擴展方法。blog
咱們把DateHelper類改爲靜態類,同時改寫DateToStrin()方法string
public static class DateHelper { public static string DateToString(this DateTime dt) { return dt.ToString("yyyy-MM-dd HH:mm:ss"); } }
此時回到主函數,輸入「now.」就能夠看見自動提示有個DateToString()方法,因而代碼能夠這樣寫:it
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的範圍內class
使用擴展方法須要注意:擴展
一、此方法必須是一個靜態方法,同時必須放在靜態類中;
二、擴展方法不能和調用的方法放在同一個類中;
三、第一個參數必需要,而且必須是this,這是拓展方法的標識。若是方法裏面還要傳入其餘參數,能夠在後面追加參數;