読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

構成ファイル取得でハマった (1)

C# .NET

仕事の合間に、 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) につづく)