【发布时间】:2016-11-07 08:18:10
【问题描述】:
我有一个有效的自定义配置部分。但是,通过ConfigurationElementCollection 获取我的数据很痛苦,但是当我尝试将我的属性实现为 IEnumerable 时,它会失败并出现错误:
ConfigurationErrorsException 未处理“属性 'contacts' 不是 ConfigurationElement。"
这是导致失败的代码:
[ConfigurationProperty("contacts", IsDefaultCollection = false)]
public IEnumerable<string> Contacts
{
get { return ((ContactCollection)base["contacts"]).Cast<ContactElement>().Select(x => x.Address); }
}
但是,如果我将其更改为:
[ConfigurationProperty("contacts", IsDefaultCollection = false)]
public ContactCollection Contacts
{
get { return ((ContactCollection)base["contacts"]); }
}
一切正常。 This 的答案听起来像是微软决定不允许的事情,所以我不能拥有除 ConfigurationElement 之外的任何类型的属性。真的是这样吗?如何将我的属性实现为 IEnumerable<string>?
如果这很重要,我正在尝试存储电子邮件,并且我希望为每个电子邮件添加一个元素,因为它们可能有很多,我们可能希望将来存储有关每个联系人的更多信息,而且我认为一个逗号分隔的列表可能会变得丑陋。例如,类似:
<emergency>
<contact address="sirdank@stackoverflow.com" />
<contact address="jon.skeet@stackoverflow.com" />
</emergency>
或者
<emergency>
<contact>sirdank@stackoverflow.com</contact>
<contact>jon.skeet@stackoverflow.com</contact>
</emergency>
谢谢!
【问题讨论】:
-
你有我的同情。带有嵌套集合的自定义配置部分是一个巨大的痛苦。我已经写了很多,但我仍然无法清楚地记住语法以提供答案。也许这篇文章会有所帮助:http://stackoverflow.com/questions/10958054/how-to-create-a-configuration-section-that-contains-a-collection-of-collections
-
在我看来,大部分复杂性源于对以编程方式更新的部分的支持或支持覆盖较低级别的配置文件。这很棒,但在实践中我们几乎从不使用它。可以肯定地说我们从不使用它。
标签: c# linq configuration configurationmanager