如何在.Net 2.0中的sectionGroup applicationSettings中按名称获取所有部分

时间:2013-02-19 17:37:21

标签: c# configuration mono .net-2.0 configurationsection

这是我的想法:

我希望一个小的可执行文件有一个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上的项目(目前位于this commit)可能会很有趣。

1 个答案:

答案 0 :(得分:22)

查看要加载到配置文件中的ConfigurationManager.OpenExeConfiguration函数。

然后在System.Configuration.Configuration上您将从ConfigurationManager.OpenExeConfiguration返回的课程中,您需要查看SectionGroups媒体资源。这将返回ConfigurationSectionGroupCollection,您可以在其中找到applicationSettings部分。

ConfigurationSectionGroupCollection中,会有一个Sections属性,其中包含ExecutableFirstModule 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;
}