42

I am using the app.config file that is created with a console application and I can read the val1 of the key1 using the ConfigurationSettings.AppSettings["key1"].ToString()

<configuration>  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
    </startup>  
    <appSettings>
        <add key="key1" value="val1" />
        <add key="key2" value="val2" />  
    </appSettings> 
</configuration>

but I have too many keys and values that I want to make them categorized.

I found something that is difficult to use in my application since I want to access the keys in a similar way to the above one

Showing all nodes and can't read a node without getting all the nodes

for example what I want to do:

<appSettings>
    <Section1>
        <add key="key1" value="val1" />
    </Section1>
    <Section2>
        <add key="key1" value="val1" />
    <Section2>
</appSettings>

and if there is a way to access it using ConfigurationSettings.AppSettings["Section1"].["key1"].ToString()

Cedric
  • 672
  • 7
  • 17
Tony Germanos
  • 477
  • 1
  • 5
  • 11

2 Answers2

86

You can add custom sections in app.config without writing additional code. All you have to do is "declaring" new section in configSections node like that

<configSections>
      <section name="genericAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>

and then you can define this section filling it with keys and values:

  <genericAppSettings>
      <add key="testkey" value="generic" />
      <add key="another" value="testvalue" />
  </genericAppSettings>

To get value of a key from this section you have to add System.Configuration dll as reference to your project, add using and use GetSection method. Example:

using System.Collections.Specialized;
using System.Configuration;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            NameValueCollection test = (NameValueCollection)ConfigurationManager.GetSection("genericAppSettings");

            string a = test["another"];
        }
    }
}

Nice thing is that you can easily make groups of sections if you need this:

<configSections>
    <sectionGroup name="customAppSettingsGroup">
      <section name="genericAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
 // another sections
    </sectionGroup>
</configSections>

  <customAppSettingsGroup>
    <genericAppSettings>
      <add key="testkey" value="generic" />
      <add key="another" value="testvalue" />
    </genericAppSettings>
    // another sections
  </customAppSettingsGroup>

If you use groups, to access sections you have to access them using {group name}/{section name} format:

NameValueCollection test = (NameValueCollection)ConfigurationManager.GetSection("customAppSettingsGroup/genericAppSettings");
Konrad Gadzina
  • 3,407
  • 1
  • 18
  • 29
  • 2
    To clarify, 'configSections' is simply a child of the 'configuration' node: [MSDN](https://msdn.microsoft.com/en-us/library/aa903350(v=vs.71).aspx) – Alex Jan 22 '18 at 13:45
0

AFAIK you can implement a custom section outside of the appsettings. For example, frameworks like Autofac and SpecFlow use these kind of sessions to support their own configuration schema. You can take a look on this MSDN article to understand how to do that. Hope that helps.

Ikaso
  • 2,268
  • 19
  • 26
  • I will use the section name before each key name to modify it and keep them all in one node (the appSettings node) because it seems it is difficult to do Thanks – Tony Germanos Feb 11 '13 at 13:00