Получите несколько экземпляров одного и того же ключа в настраиваемом разделе

В моем файле 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> независимо от ключей?


person mitchsnitchel    schedule 23.10.2018    source источник
comment
Ключ должен быть уникальным, поэтому по замыслу возвращается только последнее добавленное значение. Спрашивается, а почему у вас дубликаты ключей? И что вы планируете с ними делать?   -  person marsze    schedule 23.10.2018
comment
Мне нужно хранить получателей почты в app.config. Каждый раздел имеет собственный список записей MailTo и CC, а название раздела определяет, в какую группу отправлять почту. Поэтому мне нужно получить все записи в разделе и либо MailTo, либо CC получателя в зависимости от ключа.   -  person mitchsnitchel    schedule 23.10.2018
comment
@marsze: где документально подтверждено, что ключ NameValueCollection должен быть уникальным? Я думал, что поведение было похоже на описанное здесь. Таким образом, значения, принадлежащие повторяющемуся ключу, объединяются запятой.   -  person Tim Schmelter    schedule 23.10.2018
comment
Это не столько реализация NameValueCollection, сколько обработчик раздела конфигурации.   -  person marsze    schedule 23.10.2018
comment
@marsze: вы правы, по крайней мере, источник показывает такое поведение: sizesource.microsoft.com/#System/sys/system/configuration/ Но до сих пор не нашел документации   -  person Tim Schmelter    schedule 23.10.2018
comment
@TimSchmelter Это об общем поведении коллекций в секциях конфигурации. В любом случае NameValueCollection объединяет значения для повторяющихся ключей, что не слишком полезно.   -  person marsze    schedule 23.10.2018


Ответы (2)


ключи должны быть по определению unqiue.

«Мне нужно хранить получателей почты в app.config. У каждого раздела есть собственный список записей MailTo и CC, а название раздела определяет, в какую группу отправлять почту».

Тогда у вас не будет связки пар ключ / почта.

У вас есть несколько пар ключ / почта [].

Для каждого ключа у вас есть набор значений. Итак, вы используете набор значений. Ответ будет таким: https://stackoverflow.com/a/1779453/3346583

Конечно, в этом случае масштабируемость может стать проблемой. Но если вам нужна масштабируемость, вы, вероятно, должны решить это как отношение 1: N в базе данных / XML-файле / другой структуре данных. Скорее, чем записи app.onfig.

person Christopher    schedule 23.10.2018

Вы не должны использовать NameValueCollection. У него плохая производительность и объединяет значения для повторяющихся ключей.

Вы можете использовать KeyValuePair и создать для этого свой собственный обработчик:

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");
person marsze    schedule 23.10.2018