HOW TO:實作和呼叫自訂擴充方法 (C# 程式設計手冊)
本主題將說明如何實作您自己的擴充方法中的任何型別的。NET Framework 類別庫,或其他。您想要擴充的 NET 型別。用戶端程式碼可以使用您的擴充方法,方法是將參考加入至包含擴充方法的 DLL,以及加入 using 指示詞,該指示詞指定在其中定義擴充方法的命名空間。
若要定義及呼叫擴充方法
定義靜態類別以包含擴充方法。
對用戶端程式碼而言類別必須是可見的。如需存取範圍規則的詳細資訊,請參閱 存取修飾詞 (C# 程式設計手冊)。
以至少與包含類別相同的可視性,將擴充方法實作為靜態方法。
方法的第一個參數會指定方法進行作業的型別,前面必須加上 this 修飾詞。
在呼叫程式碼中,加入 using 指示詞以指定包含擴充方法類別的命名空間。
呼叫方法,如同它們是型別上的執行個體方法一般。
請注意,呼叫程式碼未指定第一個參數,因為它代表要套用運算子的型別,而且編譯器已知道物件的型別。您只需要透過 n 提供參數 2 的引數。
範例
下列範例實作 CustomExtensions.StringExtension 類別中名為 WordCount 的擴充方法。方法會在 String 類別上作業,指定為第一個方法參數。CustomExtensions 命名空間會匯入應用程式命名空間,且方法會在 Main 方法內部呼叫。
using System.Linq;
using System.Text;
using System;
namespace CustomExtensions
{
//Extension methods must be defined in a static class
public static class StringExtension
{
// This is the extension method.
// The first parameter takes the "this" modifier
// and specifies the type for which the method is defined.
public static int WordCount(this String str)
{
return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
namespace Extension_Methods_Simple
{
//Import the extension method namespace.
using CustomExtensions;
class Program
{
static void Main(string[] args)
{
string s = "The quick brown fox jumped over the lazy dog.";
// Call the method as if it were an
// instance method on the type. Note that the first
// parameter is not specified by the calling code.
int i = s.WordCount();
System.Console.WriteLine("Word count of s is {0}", i);
}
}
}
編譯程式碼
若要執行這個程式碼,請將它複製並貼上至在 Visual Studio 中所建立的 Visual C# 主控台應用程式專案。根據預設,這個專案是以 .NET Framework 3.5 版為目標,而且有 System.Core.dll 的參考,以及 System.Linq 的 using 指示詞。如果專案中缺少一個或多個要求,您可以手動加入。如需詳細資訊,請參閱 HOW TO:建立 LINQ 專案。
安全性
擴充方法沒有特定安全性弱點。它們無法用於模擬型別上的現有方法,因為所有名稱衝突已使用型別自行定義的執行個體或靜態方法解決。擴充方法無法存取擴充類別中的任何私用資料。