web-dev-qa-db-fra.com

Lecture des paires de valeurs clés dans le dictionnaire depuis la section de configuration app.config

J'ai actuellement un app.config dans une de mes applications configurée comme ceci:

 <?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>

Mon objectif actuel est de foreach ou simplement de lire toutes les valeurs de MajorCommands dans un Dictionary<string, string> formaté comme Dictionary<key, value>. J'ai essayé plusieurs approches différentes en utilisant System.Configuration mais aucune ne semble fonctionner et je n'ai pas pu trouver de détails pour ma question exacte. Existe-t-il un moyen approprié de procéder?

35
DanteTheEgregore

en utilisant la classe ConfigurationManager, vous pouvez obtenir une section entière de app.config fichier en tant que Hashtable que vous pouvez convertir en Dictionary si vous souhaitez:

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

vous devrez ajouter une référence à System.Configuration Assemblée

49
dkozl

Vous y êtes presque - vous venez d'imbriquer vos MajorCommands à un niveau trop profond. Il suffit de le changer en ceci:

<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>

Et puis ce qui suit fonctionnera pour vous:

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

Notez qu'il s'agit d'un Hashtable (pas de type sûr) par opposition à un dictionnaire. Si vous voulez que ce soit Dictionary<string,string> vous pouvez le convertir comme ceci:

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