Как включать простые наборы в ConfigurationSection

Существует ли способ для меня включать простой массив строк или Список <строка> на моем пользовательском подклассе ConfigurationSection? (Или массив или универсальный список простых объектов данных, в этом отношении?)

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

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

Править: принятие ответа Dan как ответ, так как это - вероятно, самая близкая вещь, которую я собираюсь получить к "старому стилю" configSections. Мне всегда было легко, гибкий, и изящный, что любой объект XmlSerializable мог легко стать configSection. Я уверен, что новая платформа более мощна; однако грустно, что это ТАКИМ ОБРАЗОМ громоздкое для простых конструкций конфигурации, что мы уменьшаемся до возвращения к Строке. Разделение ().

14
задан mikemanne 10 August 2010 в 18:19
поделиться

2 ответа

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

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

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

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

8
ответ дан 1 December 2019 в 06:59
поделиться

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

//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>
19
ответ дан 1 December 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: