天天看點

擴充方法

有時我們沒有源代碼,但是又需要在某個類中添加一些需要的方法,如何在不改變類源碼的情況下,為類添加一個或多個方法呢?擴充方法就為我們提供了一個思路

  有時我們沒有一個類的源代碼,但是又需要在這個類中添加一些需要的方法,如何在不改變類源碼的情況下,為類添加一個或多個方法呢?擴充方法就為我們提供了一個思路。

  例如,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關鍵字修飾,第一個參數定義了它擴充的類型
  • 如果類中存在執行個體方法,則優先調用執行個體方法,如果不存在執行個體方法,則調用擴充方法
  • 當擴充方法在其他程式集中時,需要先添加引用,然後添加命名空間
  • 可以讓空引用調用擴充方法,但是前提是擴充方法中沒有使用傳入的執行個體對象,否則會報空指針錯誤
c#