Как получить все разделы по имени в приложении sectiongroup applicationSettings in.Net 2.0

вот идея, которую я имел:

Я хочу, чтобы небольшой исполняемый файл имел приложение.конфигурационный файл с несколькими разделами, расположенными под секцией "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 (в настоящее время этот commit).

1 ответов


посмотри ConfigurationManager.OpenExeConfiguration функция для загрузки в файл конфигурации.

затем на System.Configuration.Configuration класс, из которого вы вернетесь ConfigurationManager.OpenExeConfiguration вы хотите, чтобы смотреть на!--6--> собственность. Это вернет ConfigurationSectionGroupCollection в котором вы найдете .

на 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 объекты. Если они равны null, они не существуют в файле configuraiton.

вы также можете получить разделы, используя ConfigurationManager.GetSection

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

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

чтобы получить список всех имен разделов и групп, которые вы могли бы сделать:

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