首先我們看看msdn上面的解釋:擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。
其實說白了就是微軟那班哥們寫好的類庫,我們無法修改,但是我們可以給這些類庫通過一種方式添加我們的一些方法。
DateTime now = DateTime.Now;//1.0 將now格式化成yyyy-MM-dd 輸出string fmtstr = now.Tostring("yyyy-MM-dd");
//2.0 將now格式化成yyyy-MM-dd HH:mm:ss 輸出
string fmtstr1 = now.Tostring("yyyy-MM-dd");
現在在這里只有一次沒有什么問題,假如在我們的系統中要用到成千上萬次了? 這個時候我們該怎么辦了,聰明的你,肯定想到了寫一個方法...
public static class ExtHelper { public static string fmtDatayyyymmdd(DateTime now) { return now.ToString("yyyy-MM-dd"); } public static string fmtDatayyyymmddhhmmss(DateTime now) { return now.ToString("yyyy-MM-dd HH:mm:ss"); } }
經過改造,上面的代碼可以改寫為如下:
DateTime now = DateTime.Now;//1.0 將now格式化成yyyy-MM-dd 輸出string fmtstr = ExtHelper.fmtDatayyyymmdd(now);//2.0 將now格式化成yyyy-MM-dd HH:mm:ss 輸出string fmtstr1 =ExtHelper.fmtDatayyyymmddhhmmss(now);
可是程序員都是很懶的,那么我們必須把這個ExtHelper記住,想想我們還有沒有更好的方法,如果要是能夠now.方法名就很好了,擴展方法就能滿足我們的這個要求...
擴展方法的寫法步驟:
1、必須放到靜態類中
2、方法必須是靜態方法
3、方法的第一個參數是類型參數,使用this 開頭
經過改造的ExtHelper類
public static class ExtHelper { public static string fmtDatayyyymmdd(this DateTime now) { return now.ToString("yyyy-MM-dd"); } public static string fmtDatayyyymmddhhmmss(this DateTime now) { return now.ToString("yyyy-MM-dd HH:mm:ss"); } }
調用如下:
DateTime now = DateTime.Now;//1.0 將now格式化成yyyy-MM-dd 輸出string fmtstr = now.fmtDatayyyymmdd();//2.0 將now格式化成yyyy-MM-dd HH:mm:ss 輸出string fmtstr1 = now.fmtDatayyyymmddhhmmss();
1、擴展方法優先級要低于實例方法
public static class ExtHelper { public static string ToUpper(this string str) { return str.ToUpper(); } }
我們都知道在string上面有一個ToUpper方法,如果此時我們在定義一個同樣的擴展方法,這個方法將不起作用...
2、擴展方法可以與實例方法構成方法的重載
public static class ExtHelper { public static string ToUpper(this string str, int num) { return str.ToUpper() + num; } }
此時,如果我們有自己的業務邏輯,那么我們可以和實例方法構成重載...
3、定義在父類上面的擴展方法,在子類對象上可以使用
public interface ipig { } public class Pig : IPig { PRivate string _name; public string Name { get { return _name; } set { if (value.Length >= 2) { _name = value; } else { //拋出異常 } } } //自動屬性 public int Age { get; set; } } public class smallPig : Pig { }
public static class ExtHelper { public static string Get(this Pig pig) { return pig.Name; } }
子類也可以點出擴展方法
var pig = new Pig(); pig.Get(); var spig = new smallPig(); spig.Get();
4、定義在接口上面的擴展方法,在實現類對象上可以使用 (EF,MVC使用很頻繁)
public static class ExtHelper { public static void Set(this IPig ipig) { } }
接口實現類也可以點出擴張方法。在MVC中的擴展在IQueryable<T>中的擴展方法,在Dbset<T>中使用
var pig = new Pig(); pig.Get(); pig.Set(); var spig = new smallPig(); spig.Get(); spig.Set();
新聞熱點
疑難解答