Как включить простые коллекции в ConfigurationSection
Есть ли способ включить простой массив строк или List <string> в моем пользовательском подклассе ConfigurationSection? (Или массив или общий список простых объектов данных, если на то пошло?)
Я знаком с новыми (и ОЧЕНЬ многословными) классами ConfigurationSection, ConfigurationElement и ConfigurationElementCollection, но я пока не эксперт.
Кажется, что ConfigurationSection должен обрабатывать простые коллекции/списки самостоятельно, без необходимости создавать собственный подкласс ConfigurationElementCollection для каждого из них. Но я не нашел ссылки на эту способность в Интернете.
Изменить: принять ответ Дэн как ответ, так как это, вероятно, самое близкое, что я собираюсь перейти к конфигурационным разделам "старого стиля". Мне всегда было легко, гибко и элегантно, что любой объект XmlSerializable может легко стать configSection. Я уверен, что новая структура более мощная; однако это печально, что это слишком громоздко для простых конфигурационных конфигураций, что мы сводимся к возврату в String.Split().
Ответы
Ответ 1
Хорошо, вы попросили простую. Наилучшим образом, самый простой способ сохранить ряд строк - использовать список с разделителями (например, разделенный запятой). Таким образом вы можете сохранить его только одним элементом (например, в appSettings).
<add key="weekDays" value="Monday,Tuesday,Wednesday,Thursday,Friday"/>
Конечно, у этого есть недостатки, но в большинстве случаев хорошо работает для простого списка. Затем вы можете использовать String.Split(), чтобы преобразовать его в массив/список.
В противном случае вы вернетесь к элементам ConfigurationSection, которые, я согласен, очень подробны и неудобны для работы. Но я не знаю никого другого, боюсь (но я счастлив, что оказался неправдоподобным!).
Ответ 2
Вот простой пример.
//START CODE
//MyCompany.MyProject.csproj which results in MyCompany.MyProject.dll
//Add a Folder called "Configuration"
namespace MyCompany.MyProject.Configuration
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
public class TransformationToDirectoryMapping : ConfigurationElement
{
private const string FRIENDLY_NAME = "FriendlyName";
private const string PICKUP_FOLDER = "PickupFolder";
[ConfigurationProperty(FRIENDLY_NAME, DefaultValue = "", IsKey = false, IsRequired = true)]
public string FriendlyName
{
get
{
return ((string)(base[FRIENDLY_NAME]));
}
set
{
base[FRIENDLY_NAME] = value;
}
}
[ConfigurationProperty(PICKUP_FOLDER, DefaultValue = "", IsKey = true, IsRequired = true)]
public string PickupFolder
{
get
{
return ((string)(base[PICKUP_FOLDER]));
}
set
{
base[PICKUP_FOLDER] = value;
}
}
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
[ConfigurationCollection(typeof(TransformationToDirectoryMapping))]
public class TransformationToDirectoryMappingCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new TransformationToDirectoryMapping();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((TransformationToDirectoryMapping)(element)).PickupFolder;
}
public TransformationToDirectoryMapping this[int idx]
{
get
{
return (TransformationToDirectoryMapping)BaseGet(idx);
}
}
new public TransformationToDirectoryMapping this[string key]
{
get
{
return (TransformationToDirectoryMapping)BaseGet(key);
}
}
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
public class TransformationToDirectoryMappingConfigSection : ConfigurationSection
{
private const string TRANSFORMATION_TO_DIRECTORY_MAPPINGS = "TransformationToDirectoryMappings";
[ConfigurationProperty(TRANSFORMATION_TO_DIRECTORY_MAPPINGS)]
public TransformationToDirectoryMappingCollection TransformationToDirectoryMappingItems
{
get { return ((TransformationToDirectoryMappingCollection)(base[TRANSFORMATION_TO_DIRECTORY_MAPPINGS])); }
}
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
public static class MyRetriever
{
public const string MAPPINGS_CONFIGURATION_SECTION_NAME = "TransformationToDirectoryMappingsSection";
public static TransformationToDirectoryMappingCollection GetTheCollection()
{
TransformationToDirectoryMappingConfigSection mappingsSection = (TransformationToDirectoryMappingConfigSection)ConfigurationManager.GetSection(MAPPINGS_CONFIGURATION_SECTION_NAME);
if (mappingsSection != null)
{
return mappingsSection.TransformationToDirectoryMappingItems;
}
return null; // OOPS!
}
}
}
//XML для файла конфигурации:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="TransformationToDirectoryMappingsSection" type="MyCompany.MyProject.Configuration.TransformationToDirectoryMappingConfigSection, MyCompany.MyProject"/>
</configSections>
<TransformationToDirectoryMappingsSection>
<TransformationToDirectoryMappings>
<add FriendlyName="Hello" PickupFolder="C:\WUWUTemp\pickups\pickup11\" />
<add FriendlyName="GoodBye" PickupFolder="C:\WUWUTemp\pickups\pickup12\" />
</TransformationToDirectoryMappings>
</TransformationToDirectoryMappingsSection>
</configuration>
Ответ 3
Архитектура параметров приложения
http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx
Хорошо, старый пост, но я вспомнил его, когда столкнулся с подобной ситуацией:
...
Если вы перейдете в Project/Project Properties (в VS2008 или VS2010).
Существует вкладка "Настройки".
Если вы добавите новое значение....
Один из типов называется:
System.Collections.Specialized.StringCollection
Дайте ему имя (я использовал "FavoriteColors" ).
Задайте тип (как указано выше).
Задайте значение (ы).
"Редактор коллекции строк" говорит "Введите строки в коллекции (по одной в строке)".
Я ввел:
Красный
Желтый
Черный
Белый
Это добавит некоторый xml в ваш файл app.config.
<setting name="FavoriteColors" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>red</string>
<string>yellow</string>
<string>black</string>
<string>white</string>
</ArrayOfString>
</value>
</setting>
(Вам будет лучше проходить шаги, а не вставлять xml выше, потому что (для краткости) я не добавлял все xml в этот пост, который сгенерирован.
Вы должны иметь возможность "получить" значения через код следующим образом:
private void ShowMyFavoriteColors()
{
Properties.Settings.Default.FavoriteColors.Cast<string>().ToList().ForEach(myfavcolor =>
{
string temp = myfavcolor;
});
}
Обратите внимание, что в приведенных выше шагах будет приведен ниже код С# (для вас создан автоматический код... это не код, который вы создаете)
но код выглядит следующим образом:
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute(@"<?xml version=""1.0"" encoding=""utf-16""?>
<ArrayOfString xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
<string>red</string>
<string>yellow</string>
<string>black</string>
<string>white</string>
</ArrayOfString>")]
public global::System.Collections.Specialized.StringCollection FavoriteColors {
get {
return ((global::System.Collections.Specialized.StringCollection)(this["FavoriteColors"]));
}
}
}
}
Ответ 4
Я знаю, что вопрос уже давно ответил... но в моих классах ConfigurationElement для коллекции строк я обычно делаю следующее:
[ConfigurationProperty("myStringCollectionProperty", DefaultValue = "")]
[TypeConverter(typeof(CommaDelimitedStringCollectionConverter))]
public StringCollection MyStringCollectionProperty
{
get { return (StringCollection)this["myStringCollectionProperty"]; }
set { this["myStringCollectionProperty"] = value; }
}
И вы можете получить список строк из этого свойства с помощью
List<string> myStrings = config.MyStringCollectionProperty.Cast<string>.ToList()