2013-02-19 23 views
10

Oto pomysł miałem:Jak zdobyć wszystkie sekcje z nazwy w sectionGroup applicationSettings w .NET 2.0

chcę mieć mały wykonywalny plik app.config z wielu sekcji, które są umieszczone pod sectionGroup " applicationSettings "(nie" appSettings ", nie muszę zapisywać do pliku). Każda sekcja będzie miała nazwę odpowiadającą modułowi, który powinien zostać załadowany, jeśli jest ustawiony.

Oto przykład:

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

Teraz gdybym określić sekcję FirstModule, chcę mój wniosek, aby załadować swój zespół. Jeśli sekcja nie jest zdefiniowana, moduł nie powinien zostać załadowany. Powinno to dotyczyć nie tylko jednego modułu, ale jeszcze nie określonej liczby.

Więc w zasadzie muszę dowiedzieć się o zdefiniowanych sekcjach w czasie wykonywania. Jak to zrobić?

Dodatkowo chcę, aby stało się to przenośnym plikiem wykonywalnym (= musi działać również w Mono), który jest wstecznie kompatybilny z .NET 2.0.

Interesujące może być spojrzenie na projekt na GitHubie (obecnie na this commit).

Odpowiedz

21

Zapoznaj się z funkcją ConfigurationManager.OpenExeConfiguration, aby załadować plik konfiguracyjny.

Następnie, w klasie System.Configuration.Configuration, otrzymasz zwrot z ConfigurationManager.OpenExeConfiguration, a zobaczysz właściwość SectionGroups. To zwróci ConfigurationSectionGroupCollection, w którym znajdziesz sekcję applicationSettings.

W ConfigurationSectionGroupCollection będzie nieruchomość Sections który zawiera Executable i FirstModuleConfigurationSection obiektów.

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

Będziemy chcieli, aby sprawdzić null po otrzymaniu przedmiotu ConfigurationSectionGroupCollection lub ConfigurationSection obiektów. Jeśli są puste, nie istnieją w pliku konfiguracyjnym.

Można również uzyskać sekcje za pomocą ConfigurationManager.GetSection

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

Ponownie, jeśli obiekty są null one nie istnieją w pliku konfiguracyjnym.

Aby uzyskać listę wszystkich nazw sekcji i grup można zrobić:

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

To pomogło, dziękuję bardzo. Chciałbym dać dwie wersje do bezpośredniego odniesienia się do mojego przykładu, ale nie mogę ... :( – HaMster

+0

Nie ma problemu, z przyjemnością pomogę, możesz zobaczyć moją ostatnią edycję.Zawarłem kilka informacji na temat 'ConfigurationManager.GetSection'. Jeśli nie musisz wykonywać żadnych innych czynności w pliku konfiguracyjnym, zwykle jest to preferowany sposób uzyskiwania dostępu do pliku konfiguracyjnego: –

+6

Konfiguracja config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None) - to otworzy konfigurację dla bieżącego pliku aplikacja nie trzeba znać ścieżki exe – timothy