21

I don't find any examples of how to access such a nested configuration section in a app.config

  <my.configuration>
    <emailNotification>
      <to value="[email protected]" />
      <from value="[email protected]" />
      <subject value="Subject" />
      <smtpHost value="smtp.you.com" />
      <triggers>
        <add name="1" varAlias="Var1" lower="-200" upper="-150"/>
      </triggers>  
    </emailNotification>
  </my.configuration>

I used ConfigurationElementCollection and ConfigurationElement before. But I don't know how to do the above?

3
  • I suppose the my.configuration is a group and emailNotification is the nested section you are referring to. Correct? Commented Feb 17, 2011 at 10:34
  • my.configuration is a section <section name="my.configuration" type="IoLoggingService.MyConfigSection, IoLoggingService"/> And emailNotification the group, yes Commented Feb 17, 2011 at 11:22
  • I will post an example in a minute. Commented Feb 17, 2011 at 11:28

1 Answer 1

38

You need to:

Define my.configuration as section group and emailNotification as a section within the group. Add following to the configuration file:

<configSections>
    <sectionGroup name="my.configuration"
                  type="SectionGroupRetrieval.MyConfigurationGroup, SectionGroupRetrieval">
        <section name="emailNotification"
                 type="SectionGroupRetrieval.EmailNotificationSection, SectionGroupRetrieval" />
    </sectionGroup>       
</configSections>

Implement the configuration section group (my.configuration).

public class MyConfigurationGroup : ConfigurationSectionGroup
{
    [ConfigurationProperty( "emailNotification" )]
    public EmailNotificationSection EmailNotification
    {
        get { return (EmailNotificationSection)base.Sections[ "emailNotification" ]; }
    }
}

Implement the configuration section (emailNotification).

public class EmailNotificationSection : ConfigurationSection
{
    [ConfigurationProperty( "to" )]
    public ValueElement To
    {
        get { return (ValueElement)base[ "to" ]; }
    }

    [ConfigurationProperty( "from" )]
    public ValueElement From
    {
        get { return (ValueElement)base[ "from" ]; }
    }

    [ConfigurationProperty( "subject" )]
    public ValueElement Subject
    {
        get { return (ValueElement)base[ "subject" ]; }
    }

    [ConfigurationProperty( "smtpHost" )]
    public ValueElement SmtpHost
    {
        get { return (ValueElement)base[ "smtpHost" ]; }
    }

    [ConfigurationProperty( "triggers" )]
    public TriggerElementCollection Triggers
    {
        get { return (TriggerElementCollection)base[ "triggers" ]; }
    }
}

Implement necessary configuration elements and configuration element collection.

public class ValueElement : ConfigurationElement
{
    [ConfigurationProperty( "value" )]
    public string Value
    {
        get { return (string)base[ "value" ]; }
        set { base[ "value" ] = value; }
    }
}

public class TriggerElement : ConfigurationElement
{
    [ConfigurationProperty( "name" )]
    public string Name
    {
        get { return (string)base[ "name" ]; }
        set { base[ "name" ] = value; }
    }

    [ConfigurationProperty( "varAlias" )]
    public string VarAlias
    {
        get { return (string)base[ "varAlias" ]; }
        set { base[ "varAlias" ] = value; }
    }

    [ConfigurationProperty( "lower" )]
    public int Lower
    {
        get { return (int)base[ "lower" ]; }
        set { base[ "lower" ] = value; }
    }

    [ConfigurationProperty( "upper" )]
    public int Upper
    {
        get { return (int)base[ "upper" ]; }
        set { base[ "upper" ] = value; }
    }
}

[ConfigurationCollection( typeof( TriggerElement ) )]
public class TriggerElementCollection : ConfigurationElementCollection
{
    public TriggerElement this[ string name ]
    {
        get { return (TriggerElement)base.BaseGet( name ); }
    }

    public TriggerElement this[ int index ]
    {
        get { return (TriggerElement)base.BaseGet( index ); }
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new TriggerElement();
    }

    protected override object GetElementKey( ConfigurationElement element )
    {
        return ( (TriggerElement)element ).Name;
    }
}

After updating the configuration file and implementing necessary configuration bits, you can access you section as follows:

Configuration config = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.None );
MyConfigurationGroup myConfiguration = (MyConfigurationGroup)config.GetSectionGroup( "my.configuration" );
EmailNotificationSection section = myConfiguration.EmailNotification;
Sign up to request clarification or add additional context in comments.

1 Comment

This works aswell for ASP.NET MVC 4.5 when using Configuration configuration = WebConfigurationManager.OpenWebConfiguration(HttpContext.Request.ApplicationPath);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.