在自定义部分中获取同一键的多个实例

时间:2018-10-23 11:08:57

标签: c# app-config configurationmanager configsection

在我的app.config文件中,我在configuration下有一个自定义部分,其中有多个条目共享同一密钥。

<setion1>
    <add key="key1" value="value1"/>
    <add key="key2" value="value2"/>
    <add key="key1" value="value3"/>
</section1>

我正在使用以下代码从读取条目中获取NameValueCollection对象。

var list = (NameValueCollection)ConfigurationManager.GetSection("section1");

我希望这段代码返回该部分下的每个条目,但是它似乎只带回与键有关的唯一值。我如何收集<section1>的所有子代,而与密钥无关?

2 个答案:

答案 0 :(得分:1)

您不应使用NameValueCollection。它具有bad performanceconcatenates values作为重复密钥。

您可以使用KeyValuePair´s为此创建自己的处理程序:

using System;
using System.Configuration;
using System.Collections.Generic;
using System.Xml;
using KeyValue = System.Collections.Generic.KeyValuePair<string, string>;

namespace YourNamespace
{
    public sealed class KeyValueHandler : IConfigurationSectionHandler
    {
        public object Create(object parent, object configContext, XmlNode section)
        {
            var result = new List<KeyValue>();
            foreach (XmlNode child in section.ChildNodes)
            {
                var key = child.Attributes["key"].Value;
                var value = child.Attributes["value"].Value;
                result.Add(new KeyValue(key, value));
            }
            return result;
        }
    }
}

配置:

<configSections>
  <section name="section1" type="YourNamespace.KeyValueHandler, YourAssembly" />
</configSections>
<setion1>
    <add key="key1" value="value1"/>
    <add key="key2" value="value2"/>
    <add key="key1" value="value3"/>
</section1>

用法:

var list = (IList<KeyValue>)ConfigurationManager.GetSection("section1");

答案 1 :(得分:1)

根据定义,键必须是unqiue。

“我必须将邮件收件人存储在app.config中。每个部分都有其自己的MailTo和CC条目列表,并且部分名称规定了将邮件发送到的组。”

然后,您没有一堆密钥/邮件对。

您有一堆密钥/邮件[]对。

对于每个键,您都有一组值。因此,您使用值的集合。要得到答案,将是这样的:https://stackoverflow.com/a/1779453/3346583

在这种情况下,当然,可伸缩性可能是个问题。但是,如果您需要可伸缩性,则应该适当地解决这一问题,无论如何,它应作为数据库/ XML文件/其他数据结构中的1:N关系。而不是app.onfig条目。