How to Create a Configuration Section That Contains a Collection

5k Views Asked by At

There is a great question and answer here that illustrates how to create a custom configuration section that is able to parse configuration of the following form into .Net objects:

<?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>

My question is, does anyone know how to create the same custom configuration section without the ConfigElements element? For example, one that would parse the following CustomConfigSection element in place of the one shown above:

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

The issue that I have is that it appears that the type CustomConfigSection needs to inherit from both ConfigurationSection and ConfigurationElementCollection, which of course is not possible in C#. The other approach I have found requires me to implement IConfigurationSectionHandler, which is deprecated as of .Net v2. Does anyone know how to accomplish the desired result? Thanks.

1

There are 1 best solutions below

0
On BEST ANSWER

You don't need to inherit from both ConfigurationSection and ConfigurationElementCollection. Instead, define your config section like this:

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

And your config element collection:

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

And config element itself:

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