如何创建不同类型的多个配置项

时间:2015-05-18 20:35:15

标签: c# .net config

是否可以获得不同类型的配置项列表,如下所示?

<exceptions>
  <exception name ="exception1" host="myhostname">
    <block user="joe"/>
    <block user="peter"/>
    <allow user="admin"/>
  </exception>
  <exception name ="exception2" host="anotherhostname">
    <block user="sue"/>
    <block user="danny"/>
    <allow user="johnny"/>
  </exception>
</exceptions>

我正在尝试定义一个允许我阻止或允许用户使用给定主机名的配置。如果我只有<allow>类型的元素,那么它会非常简单:

[ConfigurationCollection(typeof(AllowElement))]
class AllowCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new AllowElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((AllowElement) element).User;
    }

    public AllowElement this[int index]
    {
        get { return (AllowElement) BaseGet(index); }
    }

    public new AllowElement this[string key]
    {
        get { return (AllowElement) BaseGet(key); }
    }
}

class AllowElement : ConfigurationElement
{
    [ConfigurationProperty("user", IsKey = true, IsRequired = true)]
    public string User
    {
        get { return (string) base["user"]; }
    }
}

如何添加<block>配置项?它真的可能吗?

1 个答案:

答案 0 :(得分:1)

基本上,您必须覆盖IsElementName以提供对有效项名称的检查(在您的情况下为block和allow)。您还需要将这些有效值映射到ConfigurationCollection的AddItem名称属性,以逗号分隔的字符串。

您还必须覆盖CollectionType以返回ConfigurationElementCollectionType.BasicMapAlternate

然后,您需要将您的AllowElement更改为支持allow和block的通用元素。链接示例使用Enum,但您可以做任何您喜欢的事情。在CreateNewElement上,您将处理elementName并返回具有正确类型标识符的通用元素集。

这里是链接to Derek says,您可以在其中找到关于名为具有不同元素名称的收藏项

的部分的建议实施

对于复制粘贴的链接感到抱歉,但我想一个解决方案的链接看起来正是你所需要的,然后是一大堆代码,只有类名不同。