VS2008が出る前の話。拡張メソッドを使用することで、列挙型にメソッドを追加できるという点に興味を持ち、早く使って見たいと思ってました。しかし、ネット上ではあまり使わない方が良い的な書き込みが多く、使うべきかどうなのか悩んでました。
しかし、実際にVS2008やVS2010を使い出すと、使わずにはいられない、使わないともったいないことが良くわかりました。VS2008以降は拡張メソッド(とラムダ式)によって、ほんとに開発が楽になりました。
自分の場合、案件毎のプロジェクト内で拡張メソッドを作ることはほとんど無く、社内用の共通ライブラリ内で大量に作ってます。最近共通ライブラリに追加している機能は拡張メソッドばかり。拡張メソッドライブラリになっていってます。
使いどころは大体以下の3つ。
1.列挙型のメソッド
今までだと例えば列挙型の名称を取得したいと思った場合、名称を取得するstaticメソッドを作成して対応していました。
string name = DockStyleFuncton.Name(DockStyle.Fill);
拡張メソッドを使うと以下になります。
string name = DockStyle.Fill.Name();
スッキリしました。インテリセンスでメソッドが出てくるので書くのも楽です。
2.処理のパイプライン化
例えばdouble値に対して丸め→絶対値→文字列変換を順番にしたい場合、
string strValue = Math.Abs(Math.Round(doubleValue)).ToString();
拡張メソッドを使うと以下になります。
string strValue = doubleValue.Round().Abs().ToString();
したいことの順番とコーディングの順番が同じなので直感的です。
これも1と同じく、インテリセンスでメソッドが出てくるので書くのも楽です。
3.genericクラスが特定の型の場合だけ利用できるメソッド
例えば以下の拡張メソッドを作ります。
public static IEnumerable〈TValue〉 Values〈TKey, TValue〉(this IEnumerable〈KeyValuePair〈TKey, TValue〉〉 items) {
if (items == null) yield break;
foreach (var item in items) {
yield return item.Value;
}
}
すると、KeyValuePairをコレクションするListや配列の場合、Valuesメソッドが使えるようになります。
同じようにKeysメソッドやContainsKeyメソッドなども作っておくと便利。
みんなが好き勝手に拡張メソッドを追加していったらえらいことになりそうではありますが、
ライブラリ化して管理すればリスクは低そう。それよりも使うことのメリットのほうが断然大きいです。