C # AppSettings: есть ли простой способ поместить коллекцию в ‹appSetting›

Я пытался

<appSettings >
    <add key="List" value="1"/>
    <add key="List" value="2"/>
    <add key="List" value="3"/>
  </appSettings >

и System.Configuration.ConfigurationManager.AppSettings.GetValues("List");

Но я получаю только последнего члена. Как я мог легко решить эту проблему?


person Markus    schedule 18.11.2009    source источник
comment
Самое простое решение - использовать System.Collections.Specialized.StringCollection: Ответ на вопрос: Сохранить массив строк в appSettings?   -  person Serkan    schedule 23.04.2013
comment
stackoverflow.com/a/32637544/69663 дает супер-простое решение, которое не требует новых классов и позволяет избежать хакерских сплит- по разделителю.   -  person unhammer    schedule 12.08.2019


Ответы (5)


Я столкнулся с подобной проблемой, и я сделал это с помощью этого кода. Надеюсь, это поможет в твоей проблеме.

В этом случае List (похожий на мой URLSection) будет иметь полный раздел конфигурации в web.config, в котором вы сможете получить все значения из этого раздела.

<configSections>
    <section name="URLSection" type="A.WebConfigSection,A,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"/>
</configSections>

<appSettings></appSettings>

<URLSection>
    <urlCollection>
        <add url="1" value="a"/>
        <add url="2" value="b"/>
    </urlCollection>
</URLSection>

Я сделал для этого три класса: ConfigElement, ConfigElementCollection, WebConfigSection.

ConfigElement

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace A
{
  public class ConfigElement:System.Configuration.ConfigurationElement
{
    [ConfigurationProperty("url",IsRequired=true) ]
    public string url
    {
        get
        {
            return this["url"] as string;
        }
    }

    [ConfigurationProperty("value", IsRequired = true)]
    public string value
    {
        get
        {
            return this["value"] as string;
        }
    }



  }
}

ConfigElementCollection

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace A
{
  public class ConfigElementCollection:ConfigurationElementCollection
 {
    public ConfigElement this[int index]
    {
        get
        {
            return base.BaseGet(index) as ConfigElement;
        }

    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new ConfigElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((ConfigElement)(element)).url;
    }
 }
}

WebConfigSection

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace A
{
 public class WebConfigSection:ConfigurationSection
 {

    public WebConfigSection()
    {

    }

    [ConfigurationProperty("urlCollection")]
    public ConfigElementCollection allValues
    {
        get
        {
            return this["urlCollection"] as ConfigElementCollection;
        }
    }

    public static WebConfigSection GetConfigSection()
    {
        return ConfigurationSettings.GetConfig("URLSection") as WebConfigSection;
    }
 }
}
person Ashish Jain    schedule 18.11.2009
comment
очень интересная вещь, я попробую это и могу попросить о помощи, если я не получу - person Markus; 18.11.2009
comment
Я пробовал это, но у меня все работает, я получаю эту ошибку: При создании обработчика раздела конфигурации для URLSection Произошла ошибка .: Файл или сборка A, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken = null 'или один из его зависимостей не обнаружено Но почему? я только что скопировал ваш код - person Markus; 18.11.2009
comment
Маркус Я изменил имя пространства имен (A) в этом коде, поскольку оно представляет некоторые вещи, связанные с компанией, в которой я работаю. Возможно, вы не можете создать свой код, но этот дизайн вы можете найти по этой ссылке: msdn.microsoft.com/en-us/library/2tw134k3.aspx - person Ashish Jain; 18.11.2009
comment
Не могли бы вы добавить образец кода, как получить urlCollection из файла конфигурации? - person Bronek; 22.07.2013
comment
@Bronek var configUrls = WebConfigSection.GetConfigSection(); - person saml; 13.01.2016

NinjaSettings делает это из коробки.

В консоли диспетчера пакетов

Install-Package NinjaSettings

Вы бы объявили свой список как

  <appSettings>
    <add key="List" value="50,20,10,100"/>
  </appSettings>

затем создайте интерфейс с сопоставлением списка с любым ICollection или массивом

public interface IAppSettings
{
    List<int> List { get; }
}

затем войдите в свои настройки, используя оболочку NinjaSettings. Обычно вы подключаете это с помощью IOC, но основное использование

   var settings = new NinjaSettings<IAppSettings>().Settings;

   int total = 0;
   for (var i in settings.List) 
   {
      total+=i;        
   }
person Graeme Christie    schedule 31.12.2013

Вам, вероятно, будет лучше поместить эту информацию в отдельный файл XML и иметь ссылку на этот файл в AppSettings. Это даст вам больше гибкости в том, как вы извлекаете информацию и потребляете ее.

Единственное, что вам нужно - создать отдельный (статический?) Класс для чтения XML аналогично классу System.Configuration.ConfigurationManager.AppSettings.

Если, с другой стороны, он ДОЛЖЕН быть в вашем файле Web.Config, я бы предложил единственный способ добиться этого - просто иметь массив с разделителями [вертикальная черта / запятая / точка с запятой] в одном параметре «Список». .

person Phil.Wheeler    schedule 18.11.2009
comment
: S sux, я думаю, что это должно быть аналогично коллекциям в обычном приложении.Config ‹aplicationConfiguration› tag - person Markus; 18.11.2009

Haacked предлагает краткий подход к настройкам конфигурации. Его подход использует один класс, производный от ConfigurationSection. Итак, для примера его блога ваше xml-представление app.config или web.config будет выглядеть так:

<configuration>
  <configSections>
    <section name="BlogSettings" type="Fully.Qualified.TypeName.BlogSettings,   
      AssemblyName" />
  </configSections>
  <BlogSettings frontPagePostCount="10" title="You’ve Been Haacked" />
</configuration>

Это стоит прочитать:

http://haacked.com/archive/2007/03/12/custom-configuration-sections-in-3-easy-steps.aspx

person ChirpingPanda    schedule 30.09.2011

person    schedule
comment
+1 Немного хакерский, но сэкономил мне время, возиться с настраиваемыми разделами конфигурации для простого приложения. - person Paul Grimshaw; 06.09.2012
comment
Это работает, только если ключи уникальны, то есть SOMESPECIAL-01, SOMESPECIAL-02 и т. Д. Если вы просто повторите SOMESPECIAL, вы сможете получить только последний. - person Michael Sorens; 29.06.2013
comment
@PaulGrimshaw Действительно очень хакерский, а также имеет Турецкая İ проблема. Лучше вместо этого использовать перегрузку с StringComparison и String.StartsWith пока вы это делаете. - person Ronald; 30.08.2016