構成ファイル取得でハマった (1)
仕事の合間に、 5/13 に書いた「構成ファイルのテクニック - 雑記 - otherwise」の実践をやっていたのですが、一寸欲張ったらうまくいかなくてハマってしまいました。
……結局、対応策が見つからないまま断念と云う結果ではあるけど、一応、情報(後の自分への備忘録とも言う)として載せておこうと思います。
まずは記事に沿って実装してみるところまで。
XmlConfigurator.cs
これはテキスト通り。
using System; using System.Configuration; using System.Xml; using System.Xml.XPath; using System.Xml.Serialization; namespace Jp.Mkns.Configuration { public class XmlConfigurator : IConfigurationSectionHandler { public object Create(object parent, object configContext, XmlNode section) { object settings = null; XPathNavigator navigator; string typeName; Type sectionType; XmlSerializer xs; XmlNodeReader reader; if (section == null) { return settings; } navigator = section.CreateNavigator(); typeName = (string)navigator.Evaluate("string(@type)"); sectionType = Type.GetType(typeName); xs = new XmlSerializer(sectionType); reader = new XmlNodeReader(section); settings = xs.Deserialize(reader); return settings; } } }
AppData.cs
データ取得用の器を用意する。(書くのが面倒なのでプロパティを 1 個にしています)
using System; using System.Xml.Serialization; namespace Jp.Mkns.Configuration { public class AppData { private string _name; [XmlAttribute()] public string Name { get { return this._name; } set { this._name = value; } } } }
AppDataSettings.cs
AppData をリストで取得出来る様にする。(「リスト」と云うところがミソ。これがこの後でハマる原因になる。。。)
using System; using System.Collections.Generic; namespace Jp.Mkns.Configuration { public class AppDataSettings { private List<AppData> _appDataList; public List<AppData> AppDataList { get { if (this._appDataList == null) { this._appDataList = new List<AppData>(); } return this._appDataList; } set { this._appDataList = value; } } } }
ConfigurationTest.cs
エントリポイント。
using System; using System.Configuration; namespace Jp.Mkns.Configuration { class ConfigurationTest { static void Main() { AppDataSettings settings = (AppDataSettings)System.Configuration.ConfigurationManager.GetSection("AppDataSettings"); if (settings == null) { Console.WriteLine("取得失敗"); } else if (settings.AppDataList.Count == 0) { Console.WriteLine("データが0件です!"); } else { foreach (AppData data in settings.AppDataList) { Console.WriteLine(data.Name); } } } } }
app.config
最後に構成ファイルの設定を。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="AppDataSettings" type="Jp.Mkns.Configuration.XmlConfigurator, ConfigurationTest" /> </configSections> <AppDataSettings type="Jp.Mkns.Configuration.AppDataSettings, ConfigurationTest"> <AppDataList> <AppData Name="テストデータ1" /> <AppData Name="テストデータ2" /> <AppData Name="テストデータ3" /> </AppDataList> </AppDataSettings> </configuration>
ちなみに、ここで「スキーマ情報が見つからない」なるメッセージが大量に出力される。
とりあえず実行に影響がないので無視しているけど、何とかならないものですかね?
実行結果
テストデータ1 テストデータ2 テストデータ3
……と云う事で、無事成功。(以下、 (2) につづく)