カスタム拡張メソッドを実装して呼び出す方法 (C# プログラミング ガイド)

この記事では、あらゆる .NET 型を対象に独自の拡張メソッドを実装する方法について説明します。 クライアント コードでは、独自の拡張メソッドを使用できます。 クライアント プロジェクトは、その拡張メソッドを含むアセンブリを参照する必要があります。 クライアント プロジェクトでは、拡張メソッドが定義されている名前空間を指定する using ディレクティブを追加する必要があります。

拡張メソッドを定義して呼び出すには、次の手順を実行します。

  1. 拡張メソッドを格納するための静的クラスを定義します。 クラスは、クライアント コードから参照できる必要があります。別の型内に入れ子にすることはできません。 アクセシビリティの規則の詳細については、「アクセス修飾子」を参照してください。
  2. 拡張メソッドを静的メソッドとして実装します。メソッドの可視性は、包含クラスと同レベル以上を指定します。
  3. メソッドの最初のパラメーターでは、メソッドが操作する型を指定します。型名の前には this 修飾子を付加します。
  4. 呼び出し元のコードで、using ディレクティブを追加して、拡張メソッドのクラスを含む名前空間を指定します。
  5. メソッドを型のインスタンス メソッドとして呼び出します。

Note

最初のパラメーターは、演算子が適用される型を表し、コンパイラはオブジェクトの型を既に認識しているため、呼び出し元コードでは指定されません。 指定する必要があるのは、2 番目から n 番目のパラメーターの引数だけです。

次の例では、CustomExtensions.StringExtension クラスの WordCount という名前の拡張メソッドを実装します。 このメソッドは、最初のメソッド パラメーターとして指定された String クラスを操作します。 CustomExtensions 名前空間は、アプリケーション名前空間にインポートされ、メソッドは Main メソッド内で呼び出されます。

using CustomExtensions;

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);


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;
        }
    }
}

オーバーロードの解決では、拡張メソッドよりも、型自体で定義されたインスタンスまたは静的メソッドが優先されます。 拡張メソッドは、拡張されたクラスのプライベート データにはアクセスできません。

関連項目