Как да получите всички секции по име в секцията Group ApplicationSettings в .Net 2.0

Ето каква идея имах:

Искам малък изпълним файл да има файл app.config с множество секции, които се намират под sectionGroup "applicationSettings" (не "appSettings", не е нужно да пиша във файла). Всеки раздел ще има име, съответстващо на модул, който трябва да бъде зареден, ако е зададен.

Ето един пример:

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

Сега, ако дефинирам секцията FirstModule, искам приложението ми да зареди асемблирането си. Ако секцията не е дефинирана, модулът не трябва да се зарежда. Това трябва да е вярно не само за един модул, но и за още неопределен брой от тях.

Така че основно трябва да разбера за дефинираните секции по време на изпълнение. Как бих го направил?

Освен това искам това да стане преносим изпълним файл (= трябва да работи и на Mono), който е обратно съвместим с .NET 2.0.

Може да е интересно да разгледате проекта в GitHub (в момента в този ангажимент).


person HaMster    schedule 19.02.2013    source източник


Отговори (1)


Разгледайте ConfigurationManager.OpenExeConfiguration функция за зареждане във вашия конфигурационен файл.

След това на System.Configuration.Configuration клас, който ще получите обратно от ConfigurationManager.OpenExeConfiguration ще искате да погледнете свойството SectionGroups. Това ще върне ConfigurationSectionGroupCollection, в което вие ще намеря секцията applicationSettings.

В ConfigurationSectionGroupCollection ще има свойство Sections, което съдържа Executable и FirstModule ConfigurationSection обекти.

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

Ще искате да проверите за null, след като получите ConfigurationSectionGroupCollection обекта или ConfigurationSection обектите. Ако са нулеви, те не съществуват в конфигурационния файл.

Можете също да получите секциите, като използвате ConfigurationManager.GetSection

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

Отново, ако обектите са null, те не съществуват в конфигурационния файл.

За да получите списък с всички имена на раздели и групи, можете да направите:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

// use the line below instead if you want to load an app.config for a
//   different application other than the one the code is running in
// 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;
}
person JG in SD    schedule 19.02.2013
comment
Това помогна много, благодаря ви много. Бих дал два гласа за директно позоваване на моя пример, но не мога... :( - person HaMster; 19.02.2013
comment
Няма проблем, радвам се да помогна, може да искате да видите последната ми редакция. Включих малко информация за ConfigurationManager.GetSection. Което, ако не е необходимо да извършвате други действия върху конфигурационния файл, обикновено е предпочитаният начин за достъп до конфигурационния файл. - person JG in SD; 20.02.2013
comment
Конфигурация config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - това ще отвори конфигурацията за текущото приложение. няма нужда да знаете exe пътя. - person timothy; 12.09.2014
comment
Благодаря @timothy! Отличен съвет... спести ми много търсене. - person Phil Nicholas; 22.09.2016