拡張メソッドの作り方 (実装方法) C#

  • String クラスにバイト数が返してくれるメソッドが欲しい!
  • DateTime 構造体に日付が含まれる月の最終日 (末日) を返してくれるメソッドが欲しい!!
  • ICollection インターフェースに指定した条件に一致するアイテムを削除してくれるメソッドが欲しい!!!

プログラミングを続けていると、とあるクラスや構造体などに「こんな処理をしてくれるメソッドがあったら便利なのにな~。」と思うことがよくあります。
それを自分で実現することができる仕組みが .NET には用意されています。
その名も「拡張メソッド」といいます。
.NET のバージョンアップとともに、メソッドが実装されることもないことはありませんが、自分で作った方が明らかに早いですから、この便利な仕組みを使っていきましょう。

拡張メソッドとは

拡張メソッドを使用すると、既存のクラスなどを変更して再コンパイルしたり、継承して派生クラスや派生インターフェースなどを作ることなく、既存のクラスなどに新たなメソッドを追加する (追加したように見せかける) ことができます。

つまり、冒頭の String クラスに文字列のバイト数を返してくれるメソッド LengthB メソッドを追加し

のように使うことができるようになります。

拡張メソッドの作り方

拡張メソッドを作る方法はとても簡単です。
以下の3つの規則を守ってメソッドを実装するだけです。

  1. 静的クラス (static class) を作る。
  2. 作った静的クラス内に静的メソッド (static Method) を作る。
  3. 静的メソッドの1つ目の引数には、メソッドを追加する型を this キーワードを付けて指定する。

拡張メソッドは、静的メソッドをインスタンスメソッドと同様の形式で呼び出すことができるようにしてくれる仕組みなのです。

では、上記の LengthB メソッドを題材に、拡張メソッドの作り方を見ていきましょう。

拡張メソッドの実装

拡張メソッドを作成していきます。

静的クラスの作成

静的クラスの定義は以下のようになります。

ここでは namespace Extensions を作成し、そこに静的クラスの StringExtension という名前の静的クラスを作成しています。

静的メソッドの実装

静的メソッドは、作成した静的クラス内に作成します。

ここでは StringExtension クラスに LengthB という名前で int の戻り値を返す静的メソッドを作成しようとしています。

静的メソッドの1つ目の引数には追加する型を this キーワードを付けて指定します。

ここまでで、拡張メソッドはほぼ完成です。

では、残りを実装した完成コードを記載します。

上記の例では、引数が拡張メソッドを追加する型のみになっていますが、第2引数以降には通常のメソッドと同様にメソッドで使用する引数を指定することができます。

拡張メソッドの使用

拡張メソッドを使用する側では、拡張メソッドを実装したクラスの名前空間 (namespace) を using (インポート) します。

上記の例では Extensions という名前空間を作成したので以下のようにします。

これで拡張メソッドが使えるようになったので、作成したメソッドを呼び出します。

コンソールアプリケーションでの拡張メソッドの実行結果出力

拡張メソッドはインターフェースや構造体にも作成できます。また、ジェネリックな型に対しても作成が可能です。

拡張メソッドを使いこなすことができると実装の幅が広がります。
皆さんも是非、拡張メソッドを色々と作ってみてください。