【发布时间】:2015-01-17 16:48:27
【问题描述】:
我正在尝试实现一个自定义配置部分,以便我可以加载用户定义的项目列表,但运气不佳。我已经阅读了以下帖子,但我仍然无法弄清楚我做错了什么。他们似乎是很好的指南,但我在这里遗漏了一些重要的事实。我希望有人能指出具体是什么。
- How to implement a ConfigurationSection with a ConfigurationElementCollection
- Unit Testing custom ConfigurationElement & ConfigurationElementCollection
- Custom app.config section with a simple list of “add” elements
这是我的测试。当我单步执行时,config 仍然为空。这就像对GetSection 的调用什么都不做。
[TestClass]
public class ToDoConfigTests
{
[TestMethod]
public void TestGetTodoAttribute()
{
var config = ConfigurationManager.GetSection("ToDoListAttributesSection") as ToDoItemsConfigurationSection;
Assert.Fail();
}
}
我的配置类:
using System.Configuration;
using Rubberduck.ToDoItems;
namespace Rubberduck.Config
{
public class ToDoItemsConfigurationCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new ToDoListAttributeElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((ToDoListAttributeElement)element).Comment;
}
}
public class ToDoItemsConfigurationSection : ConfigurationSection
{
[ConfigurationProperty("ToDoListAttributes", IsRequired = true, IsDefaultCollection=true)]
public ToDoItemsConfigurationCollection ToDoListAttributes
{
get { return (ToDoItemsConfigurationCollection)this["ToDoListAttributes"]; }
set { this["ToDoListAttributes"] = value; }
}
}
public class ToDoListAttributeElement : ConfigurationElement
{
[ConfigurationProperty("TaskPriority", DefaultValue = TaskPriority.Low, IsRequired = true)]
public TaskPriority Priority
{
get { return (TaskPriority)this["TaskPriority"]; }
set { this["TaskPriority"] = value; }
}
[ConfigurationProperty("Comment",IsKey=true, IsRequired = true)]
public string Comment
{
get { return (string)this["Comment"]; }
set { this["Comment"] = value; }
}
}
}
最后是 app.config 文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="Rubberduck.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
<section name="ToDoListAttributesSection" type="Rubberduck.Config.ToDoItemsConfigurationSection, Rubberduck.Config"/>
</configSections>
<ToDoListAttributesSection>
<ToDoListAttributes>
<add Comment="note" TaskPriority="0" />
<add Comment="todo" TaskPriority="1" />
<add Comment="bug" TaskPriority="2"/>
</ToDoListAttributes>
</ToDoListAttributesSection>
</configuration>
【问题讨论】:
-
我刚试过@GrantWinney。它仍然为空。
标签: c# configuration app-config