この記事では、あらゆる .NET 型を対象に独自の拡張メソッドを実装する方法について説明します。 クライアント コードでは、独自の拡張メソッドを使用できます。 クライアント プロジェクトは、それらを含むアセンブリを参照する必要があります。 クライアント プロジェクトでは、拡張メソッドが定義されている名前空間を指定する using ディレクティブを追加する必要があります。
拡張メソッドを定義して呼び出すには、次の手順を実行します。
- 拡張メソッドを格納するための静的クラスを定義します。 クラスは、クライアント コードから参照できる必要があります。別の型内に入れ子にすることはできません。 アクセシビリティの規則の詳細については、「アクセス修飾子」を参照してください。
- 拡張メソッドを静的メソッドとして実装します。メソッドの可視性は、包含クラスと同レベル以上を指定します。
- メソッドの最初のパラメーターでは、メソッドが操作する型を指定します。型名の前には this 修飾子を付加します。
- 呼び出し元のコードで、
using
ディレクティブを追加して、拡張メソッドのクラスを含む名前空間を指定します。
- メソッドを型のインスタンス メソッドとして呼び出します。
注意
最初のパラメーターは、演算子が適用される型を表し、コンパイラはオブジェクトの型を既に認識しているため、呼び出し元コードでは指定されません。 指定する必要があるのは、2 番目から n
番目のパラメーターの引数だけです。
次の例では、WordCount
クラスの CustomExtensions.StringExtension
という名前の拡張メソッドを実装します。 このメソッドは、最初のメソッド パラメーターとして指定された String クラスを操作します。 CustomExtensions
名前空間は、アプリケーション名前空間にインポートされ、メソッドは Main
メソッド内で呼び出されます。
using CustomExtensions;
string s = "The quick brown fox jumped over the lazy dog.";
int i = s.WordCount();
System.Console.WriteLine($"Word count of s is {i}");
namespace CustomExtensions
{
public static class StringExtension
{
public static int WordCount(this string str)
{
return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
オーバーロードの解決では、拡張メソッドよりも、型自体で定義されたインスタンスまたは静的メソッドが優先されます。 拡張メソッドは、拡張されたクラスのプライベート データにはアクセスできません。