C#3.0之後提供extension method這個功能,簡單來說就是讓你在現有的type中加入新的的method。一般是用在內建型態或是sealed class上,一般的type我們可以透過繼承的方式來加入新method,但是我們沒辦法修改內建型態,因此extension method就派上用場了。
Extension會有以下這些特徵:
- 必須在非generic的static class中,並且宣告為static method
- Method最少要有一個參數
- 第一個參數用this關鍵字宣告
- 第一個參數不能有this以外的修飾詞,例如out或ref
- 第一個參數型態不能是pointer type
以下是一個extension method的範例
public static class StringHelper
{
public static bool IsCapitalized (this string s)
{
if (string.IsNullOrEmpty(s)) return false;
return char.IsUpper(s[0]);
}
}
IsCapitalized就是string type的extension method,我們可以這樣使用它:
Console.WriteLine("Test".IsCapitalized());
其實這段呼叫在編譯時候會被修改成去呼叫static method,背後的細節被compiler隱藏起來。
Console.WriteLine(StringHelper.IsCapitalized("Test"));
總結一下,extension method背後會做以下轉換:
arg0.Method(arg1, arg2, ...); // Extension method call
StaticClass.Method(arg0, arg1, arg2, ...); // Static method call
Interface也可以被extended,範例如下:
public static T First (this IEnumerable sequence)
{
foreach (T element in sequence)
return element;
throw new InvalidOperationException("No elements!");
}
...
Console.WriteLine("Test".First()); // Output: T