Как получить все разделы по имени в приложении 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;
}