如何在.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
属性,其中包含Executable
和FirstModule
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; }