Чтение коллекции из файла App.config - PullRequest
4 голосов
/ 28 декабря 2011

Я пытаюсь получить коллекцию Предметов из файла конфигурации приложения. Все выглядит хорошо, но я всегда выбираю 0 элементов (независимо от того, что я положил в файл конфигурации ...)

Мой код:

using System.Configuration;

namespace CustomSettingConfiguration
{
    public class TestConfigurationElement : ConfigurationElement
    {
        [ConfigurationProperty("name", IsKey = true, IsRequired = true)]
        public string Name
        {
            get { return (string) this["name"]; }
        }
    }

[ConfigurationCollection(typeof (TestConfigurationElement), AddItemName = "test")]
public class TestConfigurationElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new TestConfigurationElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((TestConfigurationElement) element).Name;
    }
}

public class TestConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty("Tests", IsDefaultCollection = true)]
    public TestConfigurationElementCollection Tests
    {
        get { return (TestConfigurationElementCollection)this["Tests"]; }
    }
}
}

И файл конфигурации:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <configSections>
    <section name="TestConfigurationSection" type="CustomSettingConfiguration.TestConfigurationSection" />
  </configSections>

  <TestConfigurationSection>
    <Tests>
      <test name="One" />
      <test name="Two" />
    </Tests>
  </TestConfigurationSection>

</configuration>

Чтобы использовать это:

  TestConfigurationSection a = new TestConfigurationSection();
  var tests = a.Tests;

Есть идеи ??

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Вам нужен другой код для загрузки настроек конфигурации:

TestConfigurationSection a = (TestConfigurationSection) System.Configuration.ConfigurationManager.GetSection("TestConfigurationSection");

также убедитесь, что сборка указана в вашем файле конфигурации:

<section name="TestConfigurationSection" type="CustomSettingConfiguration.TestConfigurationSection, ConsoleApplication1" />
1 голос
/ 28 декабря 2011

Действительно ли ему нужен собственный раздел конфигурации?Лично я редко нахожу необходимость выходить за рамки простых настроек в свойствах проекта.Вот как я это сделал в проекте, где я хотел использовать список источников, которые были разрешены и запрещены.Объект, который я хотел сохранить в конфигурации (в моем случае, user.config, но принцип тот же для app.config), является простым объектом c # (он реализует интерфейс, не относящийся к этому обсуждению, и все)

Итак, чтобы было проще, я создал класс коллекции для своего объекта.Это упрощает настройку части.Вот класс полностью:

// This is mainly declared to ease use as a User Setting
public class SpellSourceCollection : List<SpellSource>
{
    public SpellSourceCollection() : base() { }
    public SpellSourceCollection(IEnumerable<SpellSource> ListToCopy)
        : this()
    {
        this.AddRange(ListToCopy);
    }
}

Помните, что в SpellSource нет ничего особенного.Теперь в настройках проекта я могу назначить тип в качестве объекта моей коллекции.

setting the property to SpellSourceCollection

Возможно, вам придется «просмотреть» правильный пользовательский объект.Однако, как только это будет сделано, чтение из app.config (или user.config) станет простым делом.Вот как выглядит файл конфигурации (слегка сокращенно).

<setting name="Sources" serializeAs="Xml">
    <value>
        <ArrayOfSpellSource xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SpellSource>
                <Source>PFRPG Advanced Player's Guide</Source>
                <Allowed>true</Allowed>
                <BackgroundColor>White</BackgroundColor>
            </SpellSource>
            <SpellSource>
                <Source>PFRPG Core</Source>
                <Allowed>true</Allowed>
                <BackgroundColor>White</BackgroundColor>
            </SpellSource>
            <SpellSource>
                <Source>Rival Guide</Source>
                <Allowed>false</Allowed>
                <BackgroundColor>White</BackgroundColor>
            </SpellSource>
            <SpellSource>
                <Source>Ultimate Combat</Source>
                <Allowed>true</Allowed>
                <BackgroundColor>White</BackgroundColor>
            </SpellSource>
            <SpellSource>
                <Source>Ultimate Magic</Source>
                <Allowed>true</Allowed>
                <BackgroundColor>Cyan</BackgroundColor>
            </SpellSource>
        </ArrayOfSpellSource>
    </value>
</setting>

Получение свойства - просто вопрос

SpellSourceCollection settingsSources = Properties.Settings.Default.Sources;
// do stuff or even later in your project, you can save this user setting
Properties.Settings.Default.Sources = settingsSources;
Properties.Settings.Default.Save();

Вы можете применить это к своему собственному проекту аналогичным образом.,Единственные легкие хитрости - это объявление объекта коллекции и создание настройки в свойствах проекта.

...