从App.config文件中读取集合

时间:2011-12-27 20:35:43

标签: c# collections app-config

我正在尝试从应用程序的配置文件中获取Items集合。一切看起来都不错,但我总是获取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 个答案:

答案 0 :(得分:3)

您应该使用另一个代码来加载配置设置:

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

还要确保在配置文件中指定了assemply:

<section name="TestConfigurationSection" type="CustomSettingConfiguration.TestConfigurationSection, ConsoleApplication1" />

答案 1 :(得分:1)

它真的需要它自己的配置部分吗?就个人而言,我很少发现有必要超越项目属性中的简单设置。这是我在一个项目中的表现,我希望使用允许和禁止的源列表。我想在配置中保存的对象(在我的例子中,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);
    }
}

请记住&#34; SpellSource&#34;没什么特别的。现在,在项目的设置中,我可以将Type指定为我的集合对象。

setting the property to SpellSourceCollection

您可能需要浏览&#34;到正确的自定义对象。但是,一旦完成,从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();

您可以以类似的方式将其应用于您自己的项目。唯一有点棘手的问题是声明集合对象并在项目属性中创建设置。