Как включить простые коллекции в ConfigurationSection - PullRequest
14 голосов
/ 23 апреля 2010

Можно ли мне включить простой массив строк или список в мой пользовательский подкласс ConfigurationSection?(Или массив или общий список простых объектов данных?)

Я знакомлюсь с новыми (и ОЧЕНЬ подробными) классами ConfigurationSection, ConfigurationElement и ConfigurationElementCollection, но я незначит, еще эксперт.

Кажется, что ConfigurationSection должен обрабатывать простые коллекции / списки сам по себе, без необходимости создавать собственный подкласс ConfigurationElementCollection для каждого из них.Но я не нашел никаких ссылок на эту способность в Интернете.

Редактировать: принятие ответа Дэна в качестве ответа, так как это, вероятно, самая близкая вещь, которую я собираюсь добраться до "старогостиль "configSections.Я всегда считал простым, гибким и элегантным, что любой объект XmlSerializable может легко стать configSection.Я уверен, что новая структура более мощная;однако печально, что это так громоздко для простых конфигураций, что мы вынуждены вернуться к String.Split ().

Ответы [ 4 ]

19 голосов
/ 29 июля 2010

Вот простой пример.

//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>
11 голосов
/ 11 апреля 2011

Архитектура настроек приложения

http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx

Хорошо, старый пост, но я вспомнил его, когда столкнулся с подобной ситуацией:

...

Если вы перейдете в Project / Project Properties (в VS2008 или VS2010).Существует вкладка «Настройки».

Если добавить новое значение ....

Один из типов называется: System.Collections.Specialized.StringCollection

Дайте ему имя (я использовал «FavoriteColors»).

Установите тип (как указано выше).

Установите значение (я).

Коллекция «String»Редактор «говорит:« Введите строки в коллекцию (по одной на строку) ».

Я ввел:

Красный

Желтый

Черный

Белый

Это добавит немного 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;
            });
}

ПримечаниеПриведенные выше действия приведут к получению приведенного ниже кода C # (автоматически созданный код для вас .... это , а не код, который вы создаете), но код выглядит следующим образом:

        [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"]));
            }
        }
    }
}
8 голосов
/ 23 апреля 2010

ОК, вы просили просто.Ну, самый простой способ сохранить последовательность строк - это использовать список с разделителями (скажем, через запятую).Таким образом, вы можете хранить его только в одном элементе (скажем, в appSettings).

<add key="weekDays" value="Monday,Tuesday,Wednesday,Thursday,Friday"/>

Конечно, это имеет недостатки, но в большинстве случаев хорошо работает для простого списка.Затем вы можете использовать String.Split () для преобразования его обратно в массив / список.

В противном случае вы вернетесь к элементам ConfigurationSection, которые, я согласен, очень многословны и неуклюжи в работес.Но я не знаю другого пути, боюсь (но я счастлив, что оказался неправ!).

2 голосов
/ 21 апреля 2016

Я знаю, что на вопрос был дан ответ давно ... но в моих классах '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()
...