カスタムセクションハンドラを手抜きする

カスタムセクションハンドラを自作する場合、IConfigurationSectionHandler の唯一のメソッドである Create() を実装することになるのだが、ちょっと手抜きをしてみよう。
Create() メソッドの主な役割は、XmlNode として渡される構成セクション全体を読み込んで、特定のオブジェクトを返すことだ。たとえば DictionarySectionHandler は XmlNode の内容から add, remove, clear の3つのタグを読み取って Hashtable を返している。
動きとしては、XML から Object を取り出すというもので、その動作そのものは .NET Framework でサポートされているクラスがいくつか存在するので、それらをそのまま流用しちまえば超手軽に汎用的なカスタムセクションハンドラを作成することができちゃうってことになる。
候補としてすぐに思いつくのは、XmlSerializer、DataSet、ResX の3つで一長一短があるってところだろう。
標準の構成ハンドラに最も近い、といっても構造がキーと値というペアになっているってぐらいだけど、ResX が最も手軽に実装できそうな形式だと思える。与えられた XmlNode を InnerXml プロパティや System.Xml.XmlNodeReader で読み込み、System.Resources.ResXResourceReader や System.Resources.ResXResourceSet にしてしまえばいい。ResXResourceSet を返せば GetObject() を利用して型付きデータを読み込むことができるので、使用する場合に

int num = (int) ConfigurationSetting.GetConfig("custom").GetObject("number");
string text = (string) ConfigurationSetting.GetConfig("custom").GetObject("text");
Size size = (Size) ConfigurationSetting.GetConfig("custom").GetObject("size");

といったかんじで利用できることになる。*1 なお、上記のように3回 GetConfig() を実行したとしても、IConfigurationSectionHandler.Create() が呼び出されるのは1回だけ。

*1:GetConfig() が object 型なので、いきなり GetObject() は呼べないけどね。