简体   繁体   中英

ConfigurationSection won't convert to NameValueCollection

I have this Q1.config file in my Console Application (.NET 4.5.2)

<?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>

I'm reading it like this

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

This works fine:

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

But how do I get my "validationKey"? I tried these but they don't work:

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

Here you go

Your XML configuration

<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>

And you can get these values in C# using

ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = "Q1.config" };

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

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

string globalValue = validationSettings[0];

I've used an index here validationSettings[0] to access the value. You can use your key to get the value

Thanks

With the answer from @Karthik I ran into an issue... if I use ConfigurationManager.GetSection() I only get null. To get the section I have to use the config object returned by OpenMappedExeConfiguration . However, GetSection() in config isn't of type object as in ConfigurationManager, but DefaultSection from which I can't read the key value pairs, nor can I cast it to NameValueCollection . Browsing on the web I found this article with a solution that worked for me.

Basically extract the XML from the section and parse it manually with an 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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM