2013-07-15 17 views
32

Lesen habe ich zur Zeit eine app.config in einer Anwendung von mir wie so ein:keyvalue Paare in Wörterbuch von app.config configSection

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

Mein aktuelles Ziel ist es, foreach oder einfach alle Werte lesen aus MajorCommands in eine Dictionary<string, string> formatiert als Dictionary<key, value>. Ich habe mehrere verschiedene Ansätze mit System.Configuration versucht, aber keiner scheint zu funktionieren und ich konnte keine Details für meine genaue Frage finden. Gibt es einen geeigneten Weg, dies zu tun?

+0

Für zukünftige Generationen über diese Frage kommen wie ich - wenn unter Mono die Abschnittsart ausgeführt sein muss 'System.Configuration.DictionarySectionHandler, System' - Der Systemteil ist entscheidend. – MattDavey

Antwort

40

mit ConfigurationManager Klasse können Sie ganzen Abschnitt von app.config Datei als Hashtable erhalten, die Sie Dictionary umwandeln können, wenn Sie wollen:

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

Sie benötigen Bezug auf System.Configuration Montage

+4

Das '.ToDictionary (n => n.Key, n => n.Value);' muss '.ToDictionary sein (n => n.Key.ToString(), n => n.Value.ToString()); '. Ansonsten funktioniert die Antwort perfekt mit wenig hinzugefügtem Code. Vielen Dank! – DanteTheEgregore

+0

Funktioniert bei 4.5.2 nicht für mich. Das Objekt ist eine NameValueCollection, keine HashTable. – arviman

+1

Funktioniert in 4.5 und 4.6. Stellen Sie sicher, dass Ihr 'configSections'-Eintrag in Ihrer app/web.config' DictionarySectionHandler' ist und nicht 'NameValueSectionHandler'. Letzteres gibt Ihnen anstelle einer Hashtable eine 'ReadOnlyNameValueCollection'. – Nick

-1

Ich würde wahrscheinlich die Konfigurationsdatei als XML-Datei behandeln.

Dictionary<string, string> myDictionary = new Dictionary<string, string>(); 
XmlDocument document = new XmlDocument(); 
document.Load("app.config"); 
XmlNodeList mejorCommands = doc.SelectNodes("/configuration/DeviceSettings/MajorCommands/add"); 

foreach (XmlNode node in majorCommands) 
{ 
    myDictionary.Add(node.Attributes["key"].Value, node.Attributes["value"].Value) 
} 

Wenn document.Load nicht funktioniert, versuchen Sie, Ihre Konfigurationsdatei in XML-Datei zu konvertieren.

32

Sie hinzufügen sind fast da - Sie haben nur Ihre MajorCommands ein Niveau zu tief verschachtelt. Ändere es einfach dazu:

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

Und dann wird die folgende für Sie arbeiten:

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

Hinweis, dass dies ein Hashtable (nicht typsicher) in Bezug auf ein Wörterbuch gegenüber. Wenn Sie es wünschen Dictionary<string,string> können Sie es wie so konvertieren:

Dictionary<string,string> dictionary = section.Cast<DictionaryEntry>().ToDictionary(d => (string)d.Key, d => (string)d.Value); 
+1

siehe @ dkozls Antwort, wie man das macht, ohne die Verschachtelung zu entfernen (mit dem Pfad '" DeviceSettings/MajorCommands "') –

+0

yeah, ich habe das seit Jahren gesucht. Ich habe über configSectionDesigner configsections entwickelt, aber das rockt. Außerdem suchte ich ähnliche Basistypen nach dem Umgang mit Konfigurationswerten über MSDN. Es gibt nur eine nützliche Sache: https://msdn.microsoft.com/en-us/library/ system.configuration.namevaluefilesectionhandler (v = vs.110) .aspx –

Verwandte Themen