首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConfigurationSection不会转换为NameValueCollection

ConfigurationSection不会转换为NameValueCollection
EN

Stack Overflow用户
提问于 2017-03-07 13:50:27
回答 2查看 2.6K关注 0票数 0

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

代码语言:javascript
复制
<?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>

我是这样读的

代码语言:javascript
复制
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = "Q1.config" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
ConfigurationSection validationSettings = config.GetSection("validations");

这可以很好地工作:

代码语言:javascript
复制
string globalValue = config.AppSettings.Settings["globalKey"].Value;

但是我如何得到我的"validationKey“呢?我试过这些,但它们不起作用:

代码语言:javascript
复制
validationSettings["validationKey"]
validationSettings.Settings["validationKey"]
(config.GetSection("validations") as NameValueCollection)["validationKey"]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-07 15:06:00

这就是你要的

您的XML配置

代码语言:javascript
复制
<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#中使用以下命令获取这些值

代码语言:javascript
复制
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]来访问值。您可以使用您的密钥来获取值

谢谢

票数 0
EN

Stack Overflow用户

发布于 2020-12-30 12:45:44

有了@Karthik的回答,我遇到了一个问题...如果我使用ConfigurationManager.GetSection(),我只能得到null。为了获得这个部分,我必须使用OpenMappedExeConfiguration返回的配置对象。但是,config中的GetSection()不是像ConfigurationManager中那样的object类型,而是DefaultSection类型,我不能从它读取键值对,也不能将其转换为NameValueCollection。浏览网页时,我发现this article提供了一个适合我的解决方案。

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

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42641110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档