从 app.config 配置部分将键值对读入字典

Posted

技术标签:

【中文标题】从 app.config 配置部分将键值对读入字典【英文标题】:Reading keyvalue pairs into dictionary from app.config configSection 【发布时间】:2013-07-13 20:27:43 【问题描述】:

我目前在我的应用程序中有一个 app.config,如下所示:

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="DeviceSettings">
      <section name="MajorCommands" type="System.Configuration.DictionarySectionHandler"/>
    </sectionGroup>
  </configSections>
  <appSettings>
    <add key="ComPort" value="com3"/>
    <add key="Baud" value="9600"/>
    <add key="Parity" value="None"/>
    <add key="DataBits" value="8"/>
    <add key="StopBits" value="1"/>
    <add key="Ping" value="*IDN?"/>
    <add key="FailOut" value="1"/>
  </appSettings>
  <DeviceSettings>
    <MajorCommands>
      <add key="Standby" value="STBY"/>
      <add key="Operate" value="OPER"/>
      <add key="Remote" value="REMOTE"/>
      <add key="Local" value="LOCAL"/>
      <add key="Reset" value="*RST" />
    </MajorCommands>
  </DeviceSettings>
</configuration>

我当前的目标是将 MajorCommands 中的所有值读取或简单地读取到格式为 Dictionary&lt;key, value&gt;Dictionary&lt;string, string&gt; 中。我已经使用 System.Configuration 尝试了几种不同的方法,但似乎都没有奏效,而且我无法为我的确切问题找到任何详细信息。有什么合适的方法吗?

【问题讨论】:

对于像我一样遇到这个问题的后代 - 在单声道下运行时,部分类型必须是 System.Configuration.DictionarySectionHandler, System - 系统部分至关重要。 【参考方案1】:

使用ConfigurationManager 类,您可以从app.config 文件中获取整个部分为Hashtable,如果您愿意,可以将其转换为Dictionary

var section = (ConfigurationManager.GetSection("DeviceSettings/MajorCommands") as System.Collections.Hashtable)
                 .Cast<System.Collections.DictionaryEntry>()
                 .ToDictionary(n=>n.Key.ToString(), n=>n.Value.ToString());

您需要添加对System.Configuration 程序集的引用

【讨论】:

.ToDictionary(n=&gt;n.Key, n=&gt;n.Value); 必须是 .ToDictionary(n=&gt;n.Key.ToString(), n=&gt;n.Value.ToString());。除此之外,只需添加很少的代码,答案就可以完美地工作。谢谢! 在 4.5.2 中对我不起作用。该对象是 NameValueCollection,而不是 HashTable。 在 4.5 和 4.6 中运行良好。确保 app/web.config 中的 configSections 条目是 DictionarySectionHandler 而不是 NameValueSectionHandler。后者会给你一个ReadOnlyNameValueCollection 而不是一个哈希表。【参考方案2】:

您快到了 - 您只是将 MajorCommands 嵌套得太深了。只需将其更改为:

<configuration>
  <configSections>
    <section
      name="MajorCommands"
      type="System.Configuration.DictionarySectionHandler" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <MajorCommands>
    <add key="Standby" value="STBY"/>
    <add key="Operate" value="OPER"/>
    <add key="Remote" value="REMOTE"/>
    <add key="Local" value="LOCAL"/>
    <add key="Reset" value="*RST" />    
  </MajorCommands>
</configuration>

然后以下内容将为您工作:

var section = (Hashtable)ConfigurationManager.GetSection("MajorCommands");
Console.WriteLine(section["Reset"]);

请注意,这是一个哈希表(不是类型安全的),而不是字典。如果你希望它是Dictionary&lt;string,string&gt;,你可以像这样转换它:

Dictionary<string,string> dictionary = section.Cast<DictionaryEntry>().ToDictionary(d => (string)d.Key, d => (string)d.Value);

【讨论】:

查看@dkozl 的回答,了解如何在不移除嵌套的情况下执行此操作(使用路径"DeviceSettings/MajorCommands" 是的,我多年来一直在寻找这个。我曾经通过 ConfigSectionDesigner 开发 configsections,但这很糟糕.. 顺便说一句,我通过 MSDN 搜索了有关处理配置值的类似基本类型,只有一个有用的东西:msdn.microsoft.com/en-us/library/… 这适用于我的 webconfig 文件,但不适用于 app.config 进行单元测试。当我尝试在应用程序配置中使用这种字典结构运行单元测试时,测试不会运行。当我删除它时它们会运行...... Change type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 它将在 app.Config 中工作。【参考方案3】:

我可能会将配置文件视为 xml 文件。

Dictionary<string, string> myDictionary = new Dictionary<string, string>();
XmlDocument document = new XmlDocument();
document.Load("app.config");
XmlNodeList majorCommands = document.SelectNodes("/configuration/DeviceSettings/MajorCommands/add");

foreach (XmlNode node in majorCommands)

    myDictionary.Add(node.Attributes["key"].Value, node.Attributes["value"].Value)

如果 document.Load 不起作用,请尝试将您的配置文件转换为 xml 文件。

【讨论】:

这种方法的问题是部分可能被加密。 ConfigurationManager 类知道如何在加密它们的同一台服务器上解密和读取它们,因此您肯定希望在此处使用 ConfigurationManager 类。 虽然错字很少,但这是对我有用的最简单的方法,因为我不必像其他方法所说的那样编写那些自定义类。我需要阅读超过 1 个配置文件和其中的自定义部分。这是唯一有帮助的事情。谢谢。

以上是关于从 app.config 配置部分将键值对读入字典的主要内容,如果未能解决你的问题,请参考以下文章

如何将键值对添加到字典中? [复制]

在python中的字典上使用join()将键值对作为一个长字符串返回

字典的操作约束

dplyr | tidyverse:将键值对集合成单个键值(长格式)

将键值对数据批量加载到 HBASE

javascript 将键值对添加到JavaScript对象