方法: カスタム拡張メソッドを実装して呼び出す (C# プログラミング ガイド)How to: Implement and Call a Custom Extension Method (C# Programming Guide)

このトピックでは、あらゆる .NET 型を対象に独自の拡張メソッドを実装する方法について説明します。This topic shows how to implement your own extension methods for any .NET type. クライアント コードで拡張メソッドを使用するには、拡張メソッドが格納されている DLL への参照を追加し、拡張メソッドが定義されている名前空間を指定する using ディレクティブを追加します。Client code can use your extension methods by adding a reference to the DLL that contains them, and adding a using directive that specifies the namespace in which the extension methods are defined.

拡張メソッドを定義して呼び出すにはTo define and call the extension method

  1. 拡張メソッドを格納するための静的クラスを定義します。Define a static class to contain the extension method.

    このクラスは、クライアント コードから参照できる必要があります。The class must be visible to client code. アクセシビリティの規則の詳細については、「アクセス修飾子」を参照してください。For more information about accessibility rules, see Access Modifiers.

  2. 拡張メソッドを静的メソッドとして実装します。メソッドの可視性は、包含クラスと同レベル以上を指定します。Implement the extension method as a static method with at least the same visibility as the containing class.

  3. メソッドの最初のパラメーターでは、メソッドが操作する型を指定します。型名の前には this 修飾子を付加します。The first parameter of the method specifies the type that the method operates on; it must be preceded with the this modifier.

  4. 呼び出し元のコードで、using ディレクティブを追加して、拡張メソッドのクラスを含む名前空間を指定します。In the calling code, add a using directive to specify the namespace that contains the extension method class.

  5. 型のインスタンス メソッドと同じようにメソッドを呼び出します。Call the methods as if they were instance methods on the type.

    呼び出し元のコードでは最初のパラメーターを指定しません。これは演算子を適用する型を表すものであり、コンパイラはオブジェクトの型を既に認識しているためです。Note that the first parameter is not specified by calling code because it represents the type on which the operator is being applied, and the compiler already knows the type of your object. 指定する必要があるのは、2 番目から n 番目のパラメーターの引数だけです。You only have to provide arguments for parameters 2 through n.

Example

次の例では、CustomExtensions.StringExtension クラスの WordCount という名前の拡張メソッドを実装します。The following example implements an extension method named WordCount in the CustomExtensions.StringExtension class. このメソッドは、最初のメソッド パラメーターとして指定された String クラスを操作します。The method operates on the String class, which is specified as the first method parameter. CustomExtensions 名前空間は、アプリケーション名前空間にインポートされ、メソッドは Main メソッド内で呼び出されます。The CustomExtensions namespace is imported into the application namespace, and the method is called inside the Main method.

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

コードのコンパイルCompiling the Code

このコードを実行するには、Visual Studio で作成した Visual C# コンソール アプリケーション プロジェクトに、そのコードをコピーして貼り付けます。To run this code, copy and paste it into a Visual C# console application project that has been created in Visual Studio. 既定では、このプロジェクトは、.NET Framework.NET Framework のバージョン 3.5 を対象としており、System.Core.dll への参照と System.Linq の using ディレクティブが含まれます。By default, this project targets version 3.5 of the .NET Framework.NET Framework, and it has a reference to System.Core.dll and a using directive for System.Linq. これらの要件のうち 1 つまたは複数を満たしていないプロジェクトの場合は、手動で追加することができます。If one or more of these requirements are missing from the project, you can add them manually.

.NET Framework セキュリティ.NET Framework Security

拡張メソッドには、固有のセキュリティ上の脆弱性はありません。Extension methods present no specific security vulnerabilities. 名前の衝突の解決では、型自体で定義されているインスタンス メソッドまたは静的メソッドが常に優先されるため、型の既存のメソッドを偽装するために拡張メソッドが使用されることはありません。They can never be used to impersonate existing methods on a type, because all name collisions are resolved in favor of the instance or static method defined by the type itself. 拡張メソッドは、拡張されたクラスのプライベート データにはアクセスできません。Extension methods cannot access any private data in the extended class.

関連項目See also