具有非ConfigurationElement属性的自定义配置节

时间:2016-07-05 13:11:10

标签: c# linq configuration configurationmanager

我有一个有效的自定义配置部分。但是,通过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>

谢谢!

2 个答案:

答案 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的答案。