web-dev-qa-db-ja.com

app.config configセクションからキー値のペアを辞書に読み込む

現在、私のアプリケーションにはapp.configが次のように設定されています。

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="DeviceSettings">
      <section name="MajorCommands" type="System.Configuration.DictionarySectionHandler"/>
    </sectionGroup>
  </configSections>
  <appSettings>
    <add key="ComPort" value="com3"/>
    <add key="Baud" value="9600"/>
    <add key="Parity" value="None"/>
    <add key="DataBits" value="8"/>
    <add key="StopBits" value="1"/>
    <add key="Ping" value="*IDN?"/>
    <add key="FailOut" value="1"/>
  </appSettings>
  <DeviceSettings>
    <MajorCommands>
      <add key="Standby" value="STBY"/>
      <add key="Operate" value="OPER"/>
      <add key="Remote" value="REMOTE"/>
      <add key="Local" value="LOCAL"/>
      <add key="Reset" value="*RST" />
    </MajorCommands>
  </DeviceSettings>
</configuration>

私の現在の目的は、Foreachするか、MajorCommandsのすべての値をDictionary<string, string>の形式はDictionary<key, value>。 System.Configurationを使用していくつかの異なるアプローチを試しましたが、どれも機能していないようで、正確な質問の詳細を見つけることができませんでした。これを行う適切な方法はありますか?

35

ConfigurationManagerクラスを使用すると、app.configファイルからセクション全体をHashtableとして取得できます。これは、必要に応じてDictionaryに変換できます。

var section = (ConfigurationManager.GetSection("DeviceSettings/MajorCommands") as System.Collections.Hashtable)
                 .Cast<System.Collections.DictionaryEntry>()
                 .ToDictionary(n=>n.Key.ToString(), n=>n.Value.ToString());

System.Configurationアセンブリへの参照を追加する必要があります

49
dkozl

あなたはほとんどそこにいます-あなたはMajorCommandsを深すぎるレベルにネストしました。これに変更するだけです:

<configuration>
  <configSections>
    <section
      name="MajorCommands"
      type="System.Configuration.DictionarySectionHandler" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <MajorCommands>
    <add key="Standby" value="STBY"/>
    <add key="Operate" value="OPER"/>
    <add key="Remote" value="REMOTE"/>
    <add key="Local" value="LOCAL"/>
    <add key="Reset" value="*RST" />    
  </MajorCommands>
</configuration>

そして、以下があなたのために働くでしょう:

var section = (Hashtable)ConfigurationManager.GetSection("MajorCommands");
Console.WriteLine(section["Reset"]);

これは、ディクショナリではなく、ハッシュテーブル(タイプセーフではない)であることに注意してください。 Dictionary<string,string>にしたい場合は、次のように変換できます。

Dictionary<string,string> dictionary = section.Cast<DictionaryEntry>().ToDictionary(d => (string)d.Key, d => (string)d.Value);
41
Shaun McCarthy