ConfigurationSection 不会转换为 NameValueCollection

ConfigurationSection won't convert to NameValueCollection

我的控制台应用程序 (.NET 4.5.2) 中有这个 Q1.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="globalKey" value="globalValue" />
    </appSettings>

    <configSections>
        <section name="validations" type="System.Configuration.NameValueSectionHandler" />
    </configSections>

    <validations>
        <add key="validationKey" value="validationValue"/>
    </validations>
</configuration>

我是这样读的

ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = "Q1.config" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
ConfigurationSection validationSettings = config.GetSection("validations");

这很好用:

string globalValue = config.AppSettings.Settings["globalKey"].Value;

但是我如何获得我的 "validationKey"?我尝试了这些,但它们不起作用:

validationSettings["validationKey"]
validationSettings.Settings["validationKey"]
(config.GetSection("validations") as NameValueCollection)["validationKey"]

给你

您的 XML 配置

<configuration>
  <configSections>
   <section name="validations" type="System.Configuration.AppSettingsSection" />
  </configSections>
 <startup>
   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
 </startup>
 <appSettings>
   <add key="globalKey" value="globalValue" />
 </appSettings>
 <validations>
   <add key="validationKey" value="validationValue"/>
 </validations>
</configuration>

您可以使用

在 C# 中获取这些值
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = "Q1.config" };

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

NameValueCollection validationSettings = (NameValueCollection)ConfigurationManager.GetSection("validations");

string globalValue = validationSettings[0];

我在这里使用索引 validationSettings[0] 来访问该值。您可以使用您的密钥获取值

谢谢

根据@Karthik 的回答,我 运行 遇到了一个问题...如果我使用 ConfigurationManager.GetSection() 我只会得到 null。要获取该部分,我必须使用 OpenMappedExeConfiguration 返回的配置对象。但是,配置中的 GetSection() 不是 ConfigurationManager 中的 object 类型,而是 DefaultSection,我无法从中读取键值对,也无法将其转换为 NameValueCollection .在网上浏览时,我发现 this article 有一个适合我的解决方案。

基本上从该部分中提取 XML 并使用 XmlDoc 手动解析它。

public static NameValueCollection GetSectionSettings(string sectionToRead, string configPath)
{
    if (!File.Exists(configPath)) { throw new ArgumentException($"File not found: {configPath}", nameof(configPath)); }

    var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = configPath };
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

    string settingsXml = config.GetSection(sectionToRead).SectionInformation.GetRawXml();
    XmlDocument settingsXmlDoc = new XmlDocument();
    settingsXmlDoc.Load(new StringReader(settingsXml));
    NameValueSectionHandler handler = new NameValueSectionHandler();

    return handler.Create(null, null, settingsXmlDoc.DocumentElement) as NameValueCollection;
}