2013-02-19 11 views
10

Ecco l'idea che avevo:Come ottenere tutte le sezioni per nome nel sectionGroup ApplicationSettings in Net 2.0

voglio un piccolo eseguibile di avere un file app.config con più sezioni che si trovano sotto il sectionGroup " applicationSettings "(non" appSettings ", non ho bisogno di scrivere sul file). Ogni sezione avrebbe un nome corrispondente a un modulo che dovrebbe essere caricato se impostato.

Ecco un esempio:

<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="Executable" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     <section name="FirstModule" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <Executable> 
     <setting name="MyFirstSetting" serializeAs="String"> 
      <value>My awesome feature setting</value> 
     </setting> 
     </Executable> 
     <FirstModule path="path to the modules assembly"> 
     <setting name="ImportantSettingToTheModule" serializeAs="String"> 
      <value>Some important string</value> 
     </setting> 
     </FirstModule> 
    </applicationSettings> 
    </configuration> 

Ora, se io definisco la sezione FirstModule, voglio la mia applicazione per caricare il suo assemblaggio. Se la sezione non è definita, il modulo non deve essere caricato. Questo dovrebbe essere vero per non solo un modulo ma un numero non ancora definito di essi.

Quindi in pratica ho bisogno di scoprire le sezioni definite in fase di esecuzione. Come potrei farlo?

Inoltre, voglio che questo diventi un eseguibile portatile (= deve essere eseguito anche su Mono) compatibile con .NET 2.0.

Potrebbe essere interessante dare un'occhiata al progetto su GitHub (attualmente allo this commit).

risposta

21

Dai un'occhiata alla funzione ConfigurationManager.OpenExeConfiguration per caricare il tuo file di configurazione.

Poi sulla classe System.Configuration.Configuration che si otterrà indietro da ConfigurationManager.OpenExeConfiguration si vorrà esaminare la proprietà SectionGroups. Questo restituirà un ConfigurationSectionGroupCollection in cui troverai la sezione applicationSettings.

Nel ConfigurationSectionGroupCollection ci sarà una proprietà Sections che contiene gli oggetti Executable e FirstModuleConfigurationSection.

var config = ConfigurationManager.OpenExeConfiguration(pathToExecutable); 
var applicationSettingSectionGroup = config.SectionGroups["applicationSettings"]; 
var executableSection = applicationSettingSectionGroup.Sections["Executable"]; 
var firstModuleSection = applicationSettingSectionGroup.Sections["FirstModule"]; 

Si vuole verificare la presenza di null dopo aver ottenuto l'oggetto ConfigurationSectionGroupCollection o ConfigurationSection oggetti. Se sono nulli, non esistono nel file configuraiton.

È anche possibile ottenere sezioni utilizzando ConfigurationManager.GetSection

var executableSection = (ClientSettingsSection)ConfigurationManager 
    .GetSection("applicationSettings/Executable"); 
var firstModuleSection = (ClientSettingsSection)ConfigurationManager 
    .GetSection("applicationSettings/FirstModule"); 

Anche in questo caso, se gli oggetti sono null non esistono nel file di configurazione.

Per ottenere un elenco di tutti i nomi delle sezioni e dei gruppi che si possa fare:

var config = ConfigurationManager.OpenExeConfiguration(pathToExecutable); 
var names = new List<string>(); 
foreach (ConfigurationSectionGroup csg in config.SectionGroups) 
    names.AddRange(GetNames(csg)); 

foreach (ConfigurationSection cs in config.Sections) 
    names.Add(cs.SectionInformation.SectionName); 

private static List<string> GetNames(ConfigurationSectionGroup configSectionGroup) 
{ 
    var names = new List<string>(); 

    foreach (ConfigurationSectionGroup csg in configSectionGroup.SectionGroups) 
     names.AddRange(GetNames(csg)); 

    foreach(ConfigurationSection cs in configSectionGroup.Sections) 
     names.Add(configSectionGroup.SectionGroupName + "/" + cs.SectionInformation.SectionName); 

    return names; 
} 
+0

Questo ha aiutato molto, vi ringrazio molto. Vorrei dare due upvotes per riferirmi direttamente al mio esempio, ma non posso ... :( – HaMster

+0

Nessun problema, felice di aiutarti, potresti voler vedere la mia ultima modifica. Ho incluso alcune informazioni su 'ConfigurationManager.GetSection'. Che se non è necessario eseguire altre azioni sul file di configurazione, di solito è il modo preferito per accedere al file di configurazione –

+6

Configuration config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None); - questo aprirà la configurazione per l'attuale App. Non c'è bisogno di conoscere il percorso exe – timothy

Problemi correlati