2013-07-15 16 views
32

Al momento ho un app.config in un'applicazione di mine configurare in questo modo:lettura coppie KeyValue in dizionario da 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> 

Il mio obiettivo attuale è quello di foreach o semplicemente leggere tutti i valori da MajorCommands in un Dictionary<string, string> formattato come Dictionary<key, value>. Ho provato diversi approcci utilizzando System.Configuration ma nessuno sembra funzionare e non sono stato in grado di trovare alcun dettaglio là fuori per la mia domanda esatta. C'è un modo corretto per farlo?

+0

Per le generazioni future imbattersi questa domanda come ho fatto io - durante l'esecuzione in mono il tipo di sezione deve essere 'System.Configuration.DictionarySectionHandler, System' - la parte Sistema è fondamentale. – MattDavey

risposta

40

utilizzando ConfigurationManager classe è possibile ottenere tutta la sezione da app.config file come Hashtable cui è possibile convertire in Dictionary se si vuole:

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

Avrai bisogno di aggiungere il riferimento ai System.Configuration assemblaggio

+4

Il '.ToDictionary (n => n.Key, n => n.Value);' deve essere '.ToDictionary (n => n.Key.ToString(), n => n.Value.ToString()); '. Oltre a questo la risposta funziona perfettamente con un piccolo codice aggiunto. Grazie! – DanteTheEgregore

+0

Non funziona per me in 4.5.2. L'oggetto è un NameValueCollection, non un HashTable. – arviman

+1

Funziona bene in 4.5 e 4.6. Assicurati che la voce 'configSections' nella tua app/web.config sia' DictionarySectionHandler' e non 'NameValueSectionHandler'. Quest'ultimo ti darà un 'ReadOnlyNameValueCollection' invece di un Hashtable. – Nick

-1

Probabilmente tratterei il file di configurazione come un file xml.

Se documento.Non funziona, prova a convertire il file di configurazione in file xml.

32

È sono quasi arrivati ​​- hai appena annidato i tuoi MajorCommands a un livello troppo profondo. Basta cambiare a questo:

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

E allora quanto segue lavorerà per voi:

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

Si noti che questo è un Hashtable (non di tipo sicuro) al contrario di un dizionario. Se si vuole che sia Dictionary<string,string> è possibile convertire in questo modo:

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

vedere la risposta di @ dkozl su come eseguire questa operazione senza rimuovere il nesting (con il percorso "DeviceSettings/MajorCommands") –

+0

sì, lo stavo cercando da anni. Ho usato sviluppare configsections tramite ConfigSectionDesigner, ma questo scava .. btw, ho cercato tipi di base simili sulla gestione dei valori di configurazione tramite MSDN, c'è solo una cosa utile: https://msdn.microsoft.com/en-us/library/ system.configuration.namevaluefilesectionhandler (v = vs.110) .aspx –

Problemi correlati