Question

I have a customized config section in my web.config like this:

     <configSection>
            <section name="CustomConfig" type="ConfigSectionRoot" allowLocation="true" allowDefinition="Everywhere"/>
        </configSection>


    <CustomConfig>
    <ConfigRoot>
        <add key="DataBase" value="CouchDB"/>
        <add key="FrontEnd" value="Asp.Net"/>
        <add key="AppName" value="Virtual WorkPlace"/>
      </ConfigRoot>
    </CustomConfig>

<AppSettings>
<add key="DataBase" value="CouchDB"/>
</AppSettings>

My ConfigSectionRoot.cs is like this:

public class ConfigSectionRoot:ConfigurationSection
    {

        [ConfigurationProperty("key", DefaultValue = "", IsKey = true, IsRequired = true)]
        public string Key
        {
            get
            {
                return ((string)(base["key"]));
            }
            set
            {
                base["key"] = value;
            }
        }

        [ConfigurationProperty("value", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Value
        {
            get
            {
                return ((string)(base["value"]));
            }
            set
            {
                base["value"] = value;
            }
        }
    }

If i use AppSettings Instead of Custom Config I could access it like:

string results= ConfigurationManager.AppSettings["Database"];
// results wil contain "CouchDB"

Is there any way to achieve the same thing in Customized Config section ??? Pls help me out

Was it helpful?

Solution

NameValueSectionHandler

If your configuration doesn't need to be more than a key-value store, I'd go for a NameValueSectionHandler.

<section name="customConfig" type="System.Configuration.NameValueSectionHandler"/>
<!-- ... -->
<customConfig>
  <add key="DataBase" value="CouchDB" />
  <add key="FrontEnd" value="Asp.Net" />
  <add key="AppName" value="Virtual WorkPlace" />
</customConfig>

You can then read it out, just like the appSettings:

var customConfig = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("customConfig");//i have changed like this and it worked fine
var database = customConfig["DataBase"];

SingleTagSectionHandler

You could also achieve the same with a SingleTagSection:

<section name="customConfig" type="System.Configuration.SingleTagSectionHandler"/>
<!-- ... -->
<customConfig database="CouchDB" frontEnd="Asp.Net" appName="Virtual Workplace" />

And then query it with:

var customConfig = (System.Collections.Hashtable) System.Configuration.ConfigurationManager.GetConfig("customConfig");
var database = customConfig["database"];

OTHER TIPS

The .NET configuration framework provides the ConfigurationElementCollection class for representing lists of elements. In the above example, your implementation of the ConfigurationElementCollection is represented by the ConfigRoot xml element. The collection should have child elements of type "ConfigSectionRoot". The ConfigSectionRoot class should inherit from ConfigurationElement, not Configuration Section.

You must create a separate class representing the CustomConfig xml element. This class is the root of you configuration and must inherit from ConfigurationSection.

public class CustomConfigConfigurationSection : ConfigurationSection
{
    public static CustomConfigConfigurationSection Section
    {
        get
        {
            return ConfigurationManager.GetSection("customConfig") as CustomConfigConfigurationSection;
        }
    }

    public ConfigConfigurationElementCollection ConfigRoot
    {
        get
        {
            return this["configRoot"] as ConfigConfigurationElementCollection;
        }
    }
}

public class ConfigConfigurationElement : ConfigurationElement
{
    [ConfigurationProperty("key")]
    public string Key
    {
        get
        {
            return (string)this["key"];
        }
    }

    [ConfigurationProperty("value")]
    public string Value
    {
        get
        {
            return (string)this["value"];
        }
    }
}

public class ConfigConfigurationElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new ConfigConfigurationElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((ConfigConfigurationElement)element).Key;
    }

    // Slight hack to look up the direct value property of the ConfigConfigurationElement from the collection indexer
    public new string this[string key]
    {
        get
        {
            return (base[key] as ConfigConfigurationElement).Value;//I m getting the error in this line
        }
    }
}

Direct usage:

var section = CustomConfigConfigurationSection.Section;
var value = section.ConfigRoot["key"];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top