方法 : カスタム拡張メソッドを実装して呼び出す (C# プログラミング ガイド)
更新 : 2007 年 11 月
ここでは、.NET Framework クラス ライブラリの任意の型、および拡張が必要な他の .NET 型で、独自の拡張メソッドを実装する方法について説明します。クライアント コードで拡張メソッドを使用するには、拡張メソッドが格納されている DLL への参照を追加し、さらに、拡張メソッドが定義されている名前空間を指定する using ディレクティブを追加します。
拡張メソッドを定義して呼び出すには
拡張メソッドを格納するための静的クラスを定義します。
このクラスは、クライアント コードから参照できる必要があります。アクセシビリティの規則の詳細については、「アクセス修飾子 (C# プログラミング ガイド)」を参照してください。
拡張メソッドを静的メソッドとして実装します。メソッドの可視性は、包含クラスと同レベル以上を指定します。
メソッドの最初のパラメータでは、メソッドが操作する型を指定します。型名の前には this 修飾子を付加します。
呼び出し元のコードで、using ディレクティブを追加して、拡張メソッドのクラスを含む名前空間を指定します。
型のインスタンス メソッドと同じようにメソッドを呼び出します。
呼び出し元のコードでは最初のパラメータを指定しません。これは、演算子を適用する型を表すものであり、コンパイラはオブジェクトの型を既に認識しているためです。指定する必要があるのは、2 番目から n 番目のパラメータの引数だけです。
使用例
MyExtensions.StringExtension クラスの WordCount という名前の拡張メソッドを実装する方法を次の例に示します。このメソッドは、最初のメソッド パラメータとして指定された String クラスを操作します。MyExtensions 名前空間がアプリケーションの名前空間にインポートされ、メソッドが 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 Version 3.5 を対象としており、System.Core.dll への参照と System.Linq の using ディレクティブが含まれます。これらの要件が 1 つ以上プロジェクトから欠落していても、手動で追加できます。詳細については、「方法 : LINQ プロジェクトを作成する」を参照してください。
セキュリティ
拡張メソッドには、固有のセキュリティ上の脆弱性はありません。名前の衝突の解決では、型自体で定義されているインスタンス メソッドまたは静的メソッドが常に優先されるため、型の既存のメソッドを偽装するために拡張メソッドが使用されることはありません。拡張メソッドは、拡張されたクラスのプライベート データにはアクセスできません。
参照
概念
参照
静的クラスと静的クラス メンバ (C# プログラミング ガイド)