2013-02-19 14 views
10

这里是我提出的想法:如何通过名称获取所有部分在sectionGroup的applicationSettings .NET 2.0中

我想要一个小型可执行文件有属于sectionGroup下位于多个部分的app.config文件“ 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)可能很有趣。

回答

21

看看ConfigurationManager.OpenExeConfiguration函数加载你的配置文件。

然后在System.Configuration.Configuration类,你会从ConfigurationManager.OpenExeConfiguration回来,你会想看看SectionGroups财产。这将返回一个ConfigurationSectionGroupCollection其中你会发现applicationSettings部分。

ConfigurationSectionGroupCollection会有一个Sections属性,它包含了ExecutableFirstModuleConfigurationSection对象。

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

你会希望得到ConfigurationSectionGroupCollection对象或ConfigurationSection对象后检查null。如果它们为空,它们不存在于配置文件中。

您还可以通过使用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; 
} 
+0

帮助很大,非常感谢你。我会给两个直接引用我的例子的upvotes,但我不能... :( – HaMster 2013-02-19 19:43:57

+0

没问题,很高兴帮助,你可能想看看我的最新编辑,我包含了一些关于'ConfigurationManager.GetSection'的信息。如果您不需要对配置文件执行任何其他操作,通常是访问配置文件的首选方式。 – 2013-02-19 20:26:18

+6

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - 这将打开当前配置没有必要知道EXE路径 – timothy 2014-09-12 08:36:52

相关问题