MSDN中的定義是:擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this修飾符為前綴。
有點難懂,還是通過例子了解它吧
通過擴展方法,我們可以為一些.NET內置對象添加方法了,下面是為string添加一個SayHello方法
using System;namespace 擴展方法 { class Program { static void Main(string[] args) { string str = null; str.SayHello(); string str1 = "not hello"; str1.SayHello(); Console.ReadKey(); } } public static class Extension // 必須是一個靜態類 { public static void SayHello(this string str) //必須為public static 類型,且參數使用this關鍵字 { if (str == null) { Console.WriteLine("Hello"); } else Console.WriteLine("{0}", str); } } }
這樣的話在同一個命名空間下的所有string都可以使用SayHello方法了,重申一下代碼注釋中的重要要求
首先聲明擴展方法的類必須是static類,並且方法也要是static類型,擴展方法必須包含this關鍵字作為它的第一個參數類型,並且后面跟着它所擴展的類的名稱
同樣也可以為自定義對象添加擴展方法,為MyClass添加了一個getAvg方法
using System; namespace 擴展方法 { class Program { static void Main(string[] args) { MyClass mc = new MyClass(3,4); Console.WriteLine("avg is {0}", mc.getAvg()); Console.ReadKey(); } } class MyClass { private double width, height; public MyClass(double val1, double val2) { width = val1; height = val2; } public double getSum() { return width + height; } } static class ExtendMyClass { public static double getAvg(this MyClass mc) { return mc.getSum() / 2; } } }
還可以為泛型類添加擴展方法,規則跟非泛型十分類似
using System; using System.Collections.Generic; namespace 擴展方法 { class Program { static void Main(string[] args) { MyClass<int> mc = new MyClass<int>(6); mc.Print(); Console.ReadKey(); } } class MyClass<T> { private T data; public MyClass(T val) { data = val; } public T getData() { return data; } } static class ExtendMyClass { public static void Print(this MyClass<int> mc) { Console.WriteLine("Data is {0}",mc.getData()); } } }