I've seen plenty of quite complicated examples of how to load recursive configuration element collections from app.config. Here's a really simple example.
I have the app.config below. You'll see that a person can have children. Each child is also a person and so each child can have children, and so on.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="myPeople" type="NestedCustomConfig.PeopleConfigSection, NestedCustomConfig" />
</configSections>
<myPeople>
<people>
<add name="Frank" />
<add name="Stanley">
<children>
<add name="Pauline">
<children>
<add name="Augustus"/>
<add name="Zebedee" />
</children>
</add>
</children>
</add>
</people>
</myPeople>
</configuration>
To load this, I have the following classes:
using System.Configuration;
namespace NestedCustomConfig
{
public class PersonConfigurationElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true, IsKey = true)]
public string Name
{
get { return (string) base["name"]; }
set { base["name"] = value; }
}
[ConfigurationProperty("children", IsDefaultCollection = false, IsRequired = false)]
public People Children
{
get { return (People) base["children"]; }
set { base["children"] = value; }
}
}
public class People : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new PersonConfigurationElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((PersonConfigurationElement)element).Name;
}
}
public class PeopleConfigSection : ConfigurationSection
{
[ConfigurationProperty("people", IsDefaultCollection = false)]
public People People
{
get
{
return (People)base["people"];
}
}
}
}
I created a Console App for the example and have the following in Program.cs:
using System.Configuration;
namespace NestedCustomConfig
{
class Program
{
static void Main()
{
var peopleSection = ConfigurationManager.GetSection("myPeople");
}
}
}
Good luck.