c# ConfigurationSection не возвращает повторяющиеся имена

У меня есть раздел конфигурации, читающий из файла конфигурации. 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. Продукт 2 не отображается, потому что имя также «Источник». Я хочу, чтобы он отображал их все независимо от того, совпадает ли имя. Короче говоря, он не вернет ничего с тем же именем, с которым он уже сталкивался, хотя я этого хочу. Может ли кто-нибудь указать, что я сделал неправильно?

Код ниже

Раздел конфигурации

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); }
    }

}

Я уверен, что это что-то глупое :) Заранее спасибо!


person jAC    schedule 05.09.2014    source источник


Ответы (1)


Вид обоснованного предположения, но похоже на метод:

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.

person welegan    schedule 05.09.2014
comment
Ах, это нуб-программист во мне, я никогда не понимал, что делаю это (использовал учебник). Меня не слишком беспокоит поведение переопределения, поэтому возвращение GUID, вероятно, нормально. Я только что проверил это, и это работает, как и ожидалось! Большое спасибо! - person jAC; 05.09.2014
comment
случайное предположение ftw. Кроме того, когда я читал документы об этих классах, я думаю, что там упоминалось, что значение перечисления ConfigurationElementCollectionType.BasicMapAlternate также связано с поведением переопределения. Вы можете рассмотреть возможность изменения его на тот, который нельзя переопределить, в качестве дополнительной меры предосторожности. Удачи! - person welegan; 05.09.2014
comment
Сделаю! Большое спасибо! - person jAC; 05.09.2014