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

このトピックでは、あらゆる .NET 型を対象に独自の拡張メソッドを実装する方法について説明します。 クライアント コードで拡張メソッドを使用するには、拡張メソッドが格納されている DLL への参照を追加し、拡張メソッドが定義されている名前空間を指定する using ディレクティブを追加します。

拡張メソッドを定義して呼び出すには

  1. 拡張メソッドを格納するための静的クラスを定義します。

    このクラスは、クライアント コードから参照できる必要があります。 アクセシビリティの規則の詳細については、「アクセス修飾子」を参照してください。

  2. 拡張メソッドを静的メソッドとして実装します。メソッドの可視性は、包含クラスと同レベル以上を指定します。

  3. メソッドの最初のパラメーターでは、メソッドが操作する型を指定します。型名の前には this 修飾子を付加します。

  4. 呼び出し元のコードで、using ディレクティブを追加して、拡張メソッドのクラスを含む名前空間を指定します。

  5. 型のインスタンス メソッドと同じようにメソッドを呼び出します。

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

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

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

.NET セキュリティ

拡張メソッドには、固有のセキュリティ上の脆弱性はありません。 名前の衝突の解決では、型自体で定義されているインスタンス メソッドまたは静的メソッドが常に優先されるため、型の既存のメソッドを偽装するために拡張メソッドが使用されることはありません。 拡張メソッドは、拡張されたクラスのプライベート データにはアクセスできません。

関連項目