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

这是我的想法:

我希望一个小的可执行文件有一个app.config文件,其中有多个部分位于sectionGroup“applicationSettings”下(不是“appSettings”,我不需要写入该文件)。 每个部分都有一个名称,对应于一个应该加载的模块。

这是一个例子:

   
My awesome feature setting Some important string

现在,如果我定义FirstModule部分,我希望我的应用程序加载其程序集。 如果未定义该部分,则不应加载该模块。 这不仅适用于一个模块,也适用于尚未定义的模块。

所以我基本上需要在运行时找出已定义的部分。 我该怎么办?

此外,我希望它成为一个可移植的可执行文件(=它也必须在Mono上运行),它向后兼容.NET 2.0。

看看GitHub上的项目(目前在此提交中 )可能会很有趣。

查看ConfigurationManager.OpenExeConfiguration函数以加载配置文件。

然后在您将从ConfigurationManager.OpenExeConfiguration返回的System.Configuration.Configuration类中,您将要查看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"]; 

获取ConfigurationSectionGroupCollection对象或ConfigurationSection对象后,您需要检查null 。 如果它们为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(); foreach (ConfigurationSectionGroup csg in config.SectionGroups) names.AddRange(GetNames(csg)); foreach (ConfigurationSection cs in config.Sections) names.Add(cs.SectionInformation.SectionName); private static List GetNames(ConfigurationSectionGroup configSectionGroup) { var names = new List(); 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; }