我有一个有效的自定义配置部分。但是,通过ConfigurationElementCollection
获取我的数据是一件痛苦的事情,但是当我尝试将我的属性实现为IEnumerable时,它会因错误而失败:
ConfigurationErrorsException未处理"属性 '触点'不是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>
谢谢!
答案 0 :(得分:3)
提供两种方法有什么害处?第一个满足Microsoft要求,第二个满足您自己的要求。
public IEnumerable<string> Contacts
{
get
{
return ContactCollection.Cast<ContactElement>().Select(x => x.Address);
}
}
[ConfigurationProperty("contacts", IsDefaultCollection = false)]
public ContactCollection ContactCollection
{
get { return ((ContactCollection)base["contacts"]); }
}
答案 1 :(得分:1)
一个解决方案,如果你只需要一个字符串列表,就是声明一个逗号分隔(或任何分隔符)的值列表,如下所示:
<configuration>
...
<mySection contacts="bill,joe" />
...
</configuration>
使用此TypeConverter类:
{{1}}
然后您的.config文件将被简单地声明为:
{{1}}
请注意,当您总是需要明确声明属性时,这不适用于集合,例如Will的答案。