c#ConfigurationSection未返回重复的名称
本文关键字:返回 c#ConfigurationSection | 更新日期: 2023-09-27 18:20:43
我有一个从配置文件中读取的配置部分。xml看起来像这个
<GroupBySection>
<Groups>
<Group name="Source" product="Product One">
<Items>
<Item name="2003" type="radio" />
<Item name="2007" type="radio" />
<Item name="2010" type="radio" />
<Item name="2013" type="radio" />
<Item name="o365" type="radio" />
</Items>
</Group>
<Group name="Target" product="Product One">
<Items>
<Item name="2003" type="radio" />
<Item name="2007" type="radio" />
<Item name="2010" type="radio" />
<Item name="2013" type="radio" />
<Item name="o365" type="radio" />
</Items>
</Group>
<Group name="Source" product="Product Two">
<Items>
<Item name="2003" type="radio" />
<Item name="2007" type="radio" />
<Item name="2010" type="radio" />
<Item name="2013" type="radio" />
<Item name="o365" type="radio" />
</Items>
</Group>
</Groups>
</GroupBySection>
当我调用这个配置部分并进行计数时,我只看到第一个Product One结果。产品二没有显示,这是因为名称也是"来源"。无论名称是否相同,我都希望它显示所有它们。总之,即使我想让它返回,它也不会返回任何与它已经遇到的名字相同的东西。有人能指出我做错了什么吗?
下方的代码
配置部分
public class GroupByConfiguration : ConfigurationSection
{
[ConfigurationProperty("Groups")]
public GroupByElementCollection Groups
{
get { return ((GroupByElementCollection)(base["Groups"])); }
set { base["Groups"] = value; }
}
}
元件部分
public class GroupByElement : ConfigurationElement
{
// Group Attributes
[ConfigurationProperty("name", IsRequired = true)]
public string Name
{
get { return (string)base["name"]; }
}
[ConfigurationProperty("product", IsRequired = true)]
public string Product
{
get { return (string)base["product"]; }
}
[ConfigurationProperty("Items")]
public ItemElementCollection Items
{
get { return ((ItemElementCollection)(base["Items"])); }
set { base["Items"] = value; }
}
}
元素集合
[ConfigurationCollection(typeof(GroupByElement))]
public class GroupByElementCollection : ConfigurationElementCollection
{
internal const string PropertyName = "Group";
public override ConfigurationElementCollectionType CollectionType
{
get
{
return ConfigurationElementCollectionType.BasicMapAlternate;
}
}
protected override string ElementName
{
get
{
return PropertyName;
}
}
protected override bool IsElementName(string elementName)
{
return elementName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase);
}
public override bool IsReadOnly()
{
return false;
}
protected override ConfigurationElement CreateNewElement()
{
return new GroupByElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((GroupByElement)(element)).Name;
}
public GroupByElement this[int idx]
{
get { return (GroupByElement)BaseGet(idx); }
}
}
我相信这是件愚蠢的事:)提前谢谢!
这是一种有根据的猜测,但它似乎是一种方法:
protected override object GetElementKey(ConfigurationElement element)
{
return ((GroupByElement)(element)).Name;
}
是最有可能的罪魁祸首。具体来说,根据这个页面:
http://msdn.microsoft.com/en-us/library/system.configuration.configurationelementcollection.getelementkey(v=vs.110).aspx
获取在派生类中重写时指定配置元素的元素键。
换句话说,该方法返回.NET可以在子文件夹中的配置文件中标识标记的方法,该方法可以覆盖父标记。在这方面,将键限制为唯一似乎是合理的,因此通过将((GroupByElement)(element)).Name
属性指定为键,就意味着它必须是唯一的。
一种方法可能是返回Name
和Product
,另一种方法是返回集合中的Name
和索引(如果可能的话)。另一种方法是,如果您不关心覆盖行为,则每次只返回一个唯一的Guid
。