关于c#:在自定义部分中获取相同密钥的多个实例

Get multiple instances of the same key within custom section

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

1
2
3
4
5
<setion1>
   
   
   
</section1>

我使用下面的代码从读取条目中获取NameValueCollection对象。

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

我希望此代码返回该部分下的每个条目,但是它似乎只返回与键相关的唯一值。不管钥匙是什么,我怎么收集的所有孩子?


钥匙的定义必须是不合格的。

"我必须在app.config中存储邮件收件人。每个分区都有自己的mail to和cc条目列表,分区名称指定要将邮件发送到哪个组。"

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

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

对于每个键,都有一组值。所以使用一组值。答案是:https://stackoverflow.com/a/1779453/3346583

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


不应使用NameValueCollection。它的性能不好,并将重复键的值连接起来。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
        }
    }
}

配置:

1
2
3
4
5
6
7
8
<configSections>
  <section name="section1" type="YourNamespace.KeyValueHandler, YourAssembly" />
</configSections>
<setion1>
   
   
   
</section1>

用途:

2