Получить несколько экземпляров одного и того же ключа в пользовательском разделе - PullRequest
0 голосов
/ 23 октября 2018

В моем файле 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 голосов
/ 23 октября 2018

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

"Я должен хранить получателей почты в app.config. Каждый раздел имеет свой собственный список записей MailTo и CC, а название раздела определяет, какую группу отправлятьписьмо отправлено. "

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

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

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

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

0 голосов
/ 23 октября 2018

Не следует использовать 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");
...