【问题标题】:ConfigurationSection won't convert to NameValueCollectionConfigurationSection 不会转换为 NameValueCollection
【发布时间】:2017-07-27 05:41:09
【问题描述】:

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

【问题讨论】:

    标签: c# configuration config


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

    谢谢

    【讨论】:

    • 此代码是否可能已过时?当我使用ConfigurationManager.GetSection 时,我只得到空值,要获得必须使用OpenMappedExeConfiguration 返回的config 对象的部分。但是,config 中的 GetSection 不是 ConfigurationManager 中的 object 类型,而是 DefaultSection ,我无法从中读取键值对,也无法将其转换为 NameValueCollection
    【解决方案2】:

    根据@Karthik 的回答,我遇到了一个问题……如果我使用ConfigurationManager.GetSection(),我只会得到空值。要获取该部分,我必须使用OpenMappedExeConfiguration 返回的配置对象。但是,config 中的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      相关资源
      最近更新 更多