Как создать раздел конфигурации, содержащий коллекцию

Здесь есть отличный вопрос и ответ , который иллюстрирует, как создать настраиваемый раздел конфигурации, способный преобразовывать конфигурацию следующей формы в объекты .Net:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="CustomConfigSection" type="ConfigTest.CustomConfigSection,ConfigTest" />
  </configSections>

  <CustomConfigSection>
    <ConfigElements>
      <ConfigElement key="Test1" />
      <ConfigElement key="Test2" />
    </ConfigElements>
  </CustomConfigSection>

</configuration>

Мой вопрос: кто-нибудь знает, как создать такой же раздел пользовательской конфигурации без элемента ConfigElements? Например, тот, который будет анализировать следующий элемент CustomConfigSection вместо показанного выше:

  <CustomConfigSection>
    <ConfigElement key="Test1" />
    <ConfigElement key="Test2" />
  </CustomConfigSection>

У меня проблема в том, что тип CustomConfigSection должен наследоваться от обоих ConfigurationSection и ConfigurationElementCollection, что, конечно же, невозможно в C#. Другой найденный мной подход требует, чтобы я реализовал IConfigurationSectionHandler, который устарел, начиная с .Net v2. Кто-нибудь знает, как добиться желаемого результата? Спасибо.


person Jeff G    schedule 01.06.2015    source источник


Ответы (1)


Вам не нужно наследовать как от ConfigurationSection, так и от ConfigurationElementCollection. Вместо этого определите свой раздел конфигурации следующим образом:

public class CustomConfigSection : ConfigurationSection
{
    [ConfigurationProperty("", IsDefaultCollection = true)]
    public MyConfigElementCollection ConfigElementCollection
    {
        get
        {
            return (MyConfigElementCollection)base[""];
        }
    }
}

И ваша коллекция элементов конфигурации:

[ConfigurationCollection(typeof(MyConfigElement), AddItemName = "ConfigElement"]
public class MyConfigElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new MyConfigElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        if (element == null)
            throw new ArgumentNullException("element");

        return ((MyConfigElement)element).key;
    }
}

И сам элемент конфигурации:

public class MyConfigElement: ConfigurationElement
{
    [ConfigurationProperty("key", IsRequired = true, IsKey = true)]
    public string Key
    {
        get
        {
            return (string)base["key"];
        }
    }   
}
person vmg    schedule 01.06.2015