有時我們沒有源代碼,但是又需要在某個類中添加一些需要的方法,如何在不改變類源碼的情況下,為類添加一個或多個方法呢?擴充方法就為我們提供了一個思路
有時我們沒有一個類的源代碼,但是又需要在這個類中添加一些需要的方法,如何在不改變類源碼的情況下,為類添加一個或多個方法呢?擴充方法就為我們提供了一個思路。
例如,String類中沒有ShowInfo()方法。String類是密封的,是以不能從這個類中繼承。但是可以建立一個擴充方法。
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 string str = "a";
6 str.ShowInfo();
7
8 Console.ReadKey();
9 }
10 static void show(object sender, string content)
11 {
12 Console.WriteLine(content);
13 }
14 }
15
16 static class StringExtension
17 {
18 public static void ShowInfo(this string obj)
19 {
20 Console.WriteLine("為String類型添加的擴充方法!");
21 }
22 }
str.ShowInfo(); 這句代碼編譯後就相當于 StringExtension.ShowInfo(str);
當調用擴充方法ShowInfo()時,會先去找string類中是否存在這個方法,如果存在,則調用string類中的執行個體方法,如果不存在就去目前程式的擴充方法表裡去找。
我們以string類型中的擴充方法Where()為例;其實擴充方法Where()并不是在string類中定義的,而是在Enumerable類中定義的,并在Enumerable類中将Where()這個擴充方法添加到了接口IEnumerable<T>中,又因為string類型實作了接口IEnumerable<T>,是以string就存在了Where()這個擴充方法。
注意:
- 定義擴充方法的類必須是靜态類,擴充方法也必須是靜态的
- 擴充方法第一個參數必須用this關鍵字修飾,第一個參數定義了它擴充的類型
- 如果類中存在執行個體方法,則優先調用執行個體方法,如果不存在執行個體方法,則調用擴充方法
- 當擴充方法在其他程式集中時,需要先添加引用,然後添加命名空間
- 可以讓空引用調用擴充方法,但是前提是擴充方法中沒有使用傳入的執行個體對象,否則會報空指針錯誤