gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:18:47 25 4
gpt4 key购买 nike

这是我的想法:

我想要一个小的可执行文件有一个包含多个部分的 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 部分,我希望我的应用程序加载它的程序集。如果未定义该部分,则不应加载该模块。这不仅适用于一个模块,而且还适用于尚未定义数量的模块。

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

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

看看 GitHub 上的项目(目前在 this commit )可能会很有趣。

最佳答案

看看 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"];

在获取ConfigurationSectionGroupCollection 对象或ConfigurationSection 对象后,您需要检查null。如果它们为空,则它们不存在于配置文件中。

您还可以使用 ConfigurationManager.GetSection 获取这些部分

var executableSection = (ClientSettingsSection)ConfigurationManager
.GetSection("applicationSettings/Executable");
var firstModuleSection = (ClientSettingsSection)ConfigurationManager
.GetSection("applicationSettings/FirstModule");

同样,如果对象为 null,则它们不存在于配置文件中。

要获取所有部分名称和组的列表,您可以执行以下操作:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

// use the line below instead if you want to load an app.config for a
// different application other than the one the code is running in
// 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;
}

关于c# - 如何在 .Net 2.0 的 sectionGroup applicationSettings 中按名称获取所有部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14963870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com