是否可以获得不同类型的配置项列表,如下所示?
<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>
配置项?它真的可能吗?
答案 0 :(得分:1)
基本上,您必须覆盖IsElementName以提供对有效项名称的检查(在您的情况下为block和allow)。您还需要将这些有效值映射到ConfigurationCollection的AddItem名称属性,以逗号分隔的字符串。
您还必须覆盖CollectionType
以返回ConfigurationElementCollectionType.BasicMapAlternate
。
然后,您需要将您的AllowElement更改为支持allow和block的通用元素。链接示例使用Enum,但您可以做任何您喜欢的事情。在CreateNewElement上,您将处理elementName并返回具有正确类型标识符的通用元素集。
这里是链接to Derek says,您可以在其中找到关于名为具有不同元素名称的收藏项
的部分的建议实施对于复制粘贴的链接感到抱歉,但我想一个解决方案的链接看起来正是你所需要的,然后是一大堆代码,只有类名不同。