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