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

пробовал

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

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

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

5 ответов


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

в этом случае список (подобный моему URLSection) будет иметь полный раздел конфигурации в интернете.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;
    }
 }
}

    foreach (string str in ConfigurationManager.AppSettings.AllKeys)
    {
        if (str.ToUpper().IndexOf("SOMESPECIAL") > -1) //the somespecial ones you want to add in
            lstList.Add(ConfigurationManager.AppSettings[str]);
    }

NinjaSettings это из коробки.

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

Install-Package NinjaSettings

вы объявите свой список как

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

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

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

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

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

   int total = 0;
   for (var i in settings.List) 
   {
      total+=i;        
   }

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

единственное, что вы хотели бы создать отдельный (статический?) класс для чтения XML аналогично системе.Конфигурация.Диспетчер конфигураций.Параметр appsettings класса.

Если, с другой стороны, это должно было быть в веб.Конфигурационный файл, я бы предложил единственный способ достичь этого - просто иметь массив с разделителями [pipe/comma/semi-colon] в одном параметре "List".


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

<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