擴展方法 使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。
當我們vs中編寫代碼使用Linq 的時候,經常會看到智能提示出現帶如下符號的方法:
這就是擴展方法。
如何定義自己的擴展方法呢?MSDN給出了詳細的解釋(具體可以參閱 實現和調用自定義擴展方法):
1、定義一個靜態類以包含擴展方法。該類必須對客戶端代碼可見。
2、將該擴展方法實現為靜態方法,並使其至少具有與包含類相同的可見性。
3、該方法的第一個參數指定方法所操作的類型;該參數必須以 this 修飾符開頭。
4、在調用代碼中,添加一條 using 指令以指定包含擴展方法類的命名空間。
5、按照與調用類型上的實例方法一樣的方式調用擴展方法。
下面來舉兩個小例子來說明一下擴展方法的定義和調用:
1、首先看一個最簡單的,來為String 類 定義一個擴展方法:
public static class MehtondExtension { public static string tostring(this string s) { return (string.Format("Extension output: {0}", s)); } }
注意 類的定義和方法的定義都有static 修飾,方法的第一個參數有 this 修飾符
在Main函數中進行調用:
class Program { static void Main(string[] args) { string s = "Hello World"; Console.WriteLine(s.ExToString()); Console.ReadKey(); } }
結果輸出 :Extension output: Hello World
2、來個略微復雜一點的,我們為一個集合添加一個查詢的擴展方法,當然用linq可以更直接,這里舉例只是為了說明擴展方法的使用:
//學生類 public class Student { public string Name { get; set; } public int Age { get; set; } public string City { get; set; } } //集合類 public class StudentList:List<Student> { public StudentList() { this.Add(new Student() { Name = "張三", Age = 22, City = "北京" }); this.Add(new Student() { Name = "李四", Age = 23, City = "北京" }); this.Add(new Student() { Name = "王武", Age = 24, City = "南京" }); this.Add(new Student() { Name = "何二", Age = 25, City = "南京" }); } } //擴展方法 //根據城市名稱返回學生列表 public static class StuListExtension { public static IEnumerable<Student> GetStudentByCity(this List<Student> stuList, string city) { var result = stuList.Where(s => s.City == city).Select(s => s); return result; } }
在Main函數中進行調用:
class Program { static void Main(string[] args) { StudentList StudentSource = new StudentList(); IEnumerable<Student> bjStudents = StudentSource.GetStudentByCity("北京"); Console.WriteLine("北京的學生列表:"); foreach (var s in bjStudents) { Console.WriteLine(string.Format("姓名:{0} 年齡:{1} 城市:{2}", s.Name, s.Age, s.City)); } Console.ReadKey(); } }
結果顯示: