4

在我的 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>而不考虑钥匙?

4

2 回答 2

1

根据定义,键必须是 unqiue。

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

那么你就没有一堆密钥/邮件对。

你有一堆 key/mail[] 对。

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

当然,在这种情况下,可扩展性可能是个问题。但是,如果您需要可扩展性,您可能应该将其解决为数据库/XML 文件/其他数据结构中的 1:N 关系。而不是 app.config 条目。

于 2018-10-23T13:11:02.217 回答
1

你不应该使用NameValueCollection. 它的性能很差,并且会连接重复键的值。

您可以使用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");
于 2018-10-23T11:59:50.107 回答