ConfigurationSection不会转换为NameValueCollection

时间:2017-03-07 05:50:27

标签: c# configuration config

我的控制台应用程序(.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"]

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:-1)

你去吧

您的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]来访问该值。您可以使用密钥获取值

由于