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



是否可能有如下所示的不同类型的配置项列表?

<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>配置项?这真的可能吗?

基本上,您必须重写IsElementName以提供对有效项目名称的检查(在您的例子中是block和allow)。您还需要将这些有效值映射到ConfigurationCollection的AddItem name属性,作为逗号分隔的字符串。

您还必须重写CollectionType以返回ConfigurationElementCollectionType.BasicMapAlternate

然后你需要改变你的AllowElement为一个通用元素,将支持允许和块。链接示例使用Enum,但您也可以按照自己的喜好进行操作。在CreateNewElement中,您将处理elementName并返回具有正确类型标识符的泛型元素集。

这里是Derek says的链接,在那里你可以找到我关于部分的建议的实现,该部分具有不同的元素名称

集合项

很抱歉复制粘贴的链接,但我猜一个链接到一个解决方案,看起来正是你需要的是比一个巨大的blob代码没有什么,但类名是不同的。

相关内容

  • 没有找到相关文章

最新更新