我正在尝试从应用程序的配置文件中获取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;
任何想法??
提前致谢
答案 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指定为我的集合对象。
您可能需要浏览&#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();
您可以以类似的方式将其应用于您自己的项目。唯一有点棘手的问题是声明集合对象并在项目属性中创建设置。