今年の初旬に"拡張メソッド"と呼ばれるC#およびVBの新しい言語拡張機能についてブログを書きました。
拡張メソッドとは、開発者が新しいメソッドをサブクラスにしたり、元の型を再コンパイルする必要なく、既存のCLRタイプの公開コントラクトへ追加することができます。それにより、それらのメソッドは様々な有用なシナリオ(LINQを含む)が有効になります。またそれらが提供する非常に便利な方法で"シンタクティックシュガー"を少しコードに追加することができます。
過去数カ月間にいつか時間ができたときゆっくり座って実装しようと思っている(それがいつになるか分りませんが、少なくともアイディアを考えるのは楽しいです。)優れた拡張メソッドの一覧を作成してきました。拡張メソッドに追加した2つのシナリオはJSON (JavaScript Object Notation) またはXMLのシリアライゼーション文字列を.NETオブジェクトに対して自動生成する簡単なメソッドです。
簡単なシナリオ: ToJSON() 拡張メソッド
以下の様に定義されたPersonオブジェクトがあると仮定します。(注:実装にあたり新しい自動プロパティ機能を使用しています。):
Personオブジェクトのコレクションを初期化し、その上でToJSON()拡張メソッドを以下の様に呼び出すだけでプログラム的にオブジェクトのJSON文字列表示を取得することができます。:
これは今日.NETのObjectクラス上にビルドインされているToString()メソッドの様な動作をします。但し、これはクライアント上でAJAXシナリオに使用することができるコレクションのJSON形式表示を生成します。:
注:上記のようにデバッガで拡大鏡をクリックするとVS内でテキストビジュアライザがポップアップしてJSONのシリアライゼーションをクリーンな形で見ることができます。
この文字列形式はクライアント上でJavaScript内で使用することができ、コレクションを表示する適切なJavaScriptオブジェクト初期化します。(注:ASP.NETAJAXはビルドインでJavaScriptライブラリがありこれをサポートしています。)
ToJSON拡張メソッドの実装
基礎的なToJSON()拡張メソッドの実装は非常に簡単です。必要なことはJavaScriptSerializerクラスをSystem.Web.Script.Serialization名前空間で使用し、2つの拡張メソッドを以下のように定義するだけです。メソッドの1つはオブジェクトグラフをどこのレベルまでもシリアライズし、もう1つはオーバーロードされたバージョンで、オプションでどこのレベルまで帰納するかを制限することができます。(例えば、ToJSON(2)だとそのオブジェクトグラフで2つのレベルまでしかシリアライズしません。)
上記のToJSON()拡張メソッドは"Object"型に対して定義されていることをご確認ください。つまり、メソッドは.NET(コレクションだけでなく)のすべてのオブジェクトと使用することができます。上記でコレクション上ではToJSON()を呼び出してますが、各Personオブジェクトまたその他の.NETデータ型の上でもToJSON()を呼び出すことができます。
拡張メソッドを使用するのに必要なことは、定義されている名前空間を参照するためにプログラムの上部でusingステートメントを追加するだけです。
そうすると、VS 2008はインテリセンスとコンパイル時のサポートを全てのオブジェクトに対して提供します。
注:JavaScriptSerializer クラスに加え、.NET3.5では現在新しいSystem.Runtime.Serialization.DataContractJsonSerializerクラスが含まれているので、JSONシリアライゼーション/デシリアライゼーションを使用することができます。
まとめ
上記のサンプルが、拡張メソッドに便利な機能を簡単にカプセル化できる例として示せれていれば幸いです。上記のような便利な拡張メソッドを提供するユーティリティライブラリがいくつかこれから出現してくるのではと期待しています。
その他にもしあなたが再利用可能な拡張メソッドにパッケージングしたほうがいいと思うようなよくあるシナリオがあればご提案ください。(ご提案にはこの投稿のコメントをお気軽にご利用ください。)そうして頂ければ、それらを簡単に利用できるように1つのライブラリにまとめるCodePlexプロジェクトをどのように作成するか検討していきます。
Hope this helps,
Scott
P.S. またヒント/仕掛け、チュートリアルのページでこれまでの便利なASP.NETおよび.NETについての投稿もご確認ください。