[转]C#中使用自定义配置(app.config)

先来看一个常见的配置文件模板:

<configuration>
    <configSections>    //配置节声明区域,包含配置节和命名空间声明
        <section>              //配置节声明
            <sectionGroup/>       //定义配置节组
        </section>       //配置节组中的配置节声明
    </configSections>
    <appSettings/> //预定义配置节
    <Custom element for configuration section>  //配置节设置区域
</configuration>

自定义配置可分为:自定义配置节和自定义配置节组。

1. 自定义配置节

要使用自定义配置需要修改两处地方,一是在<configSections/>中声明配置节,二是在<Custom element for configuration section>处设置配置节的具体配置。

声明配置节语法:

<section name="" type=""/>

<section>:声明新配置节

name:自定义配置节的名称

type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、System.Configuration.DictionarySectionHandler、System.Configuration.NameValueSectionHandler。

SingleTagSectionHandler 配置节返回类型为 Systems.Collections.IDictionary
DictionarySectionHandler 配置节返回类型为 Systems.Collections.IDictionary
NameValueSectionHandler 配置节返回类型为 Systems.Collections.Specialized.NameValueCollection

下面是一个完整的自定义配置节示例代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="UrlString" type="System.Configuration.SingleTagSectionHandler"/>
    <section name="UrlString2" type="System.Configuration.DictionarySectionHandler"/>
  </configSections>
  <UrlString action="add" paramString="id=1"></UrlString>
  <UrlString2>
    <add key="add" value="id=1"/>
    <add key="edit" value="id=2"/>
  </UrlString2>
</configuration>

程序中读取配置代码如下:

        static void Main(string[] args)
        {
            //访问 UrlString 配置节
            IDictionary dict = ConfigurationManager.GetSection("UrlString") as IDictionary;
            Console.WriteLine(string.Format("{0}?{1}", dict["action"], dict["paramString"]));

            //访问 UrlString2 配置节
            IDictionary dict2 = ConfigurationManager.GetSection("UrlString2") as IDictionary;
            foreach (DictionaryEntry e in dict2)
            {
                Console.WriteLine(string.Format("{0}?{1}", e.Key, e.Value));
            }

            Console.Read();
        }

2. 自定义配置节组

配置节组是使用<sectionGroup>元素来声明,在配置节组中可以包括多个配置节<section>,如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="TestGroup">
            <section name="Test" type="System.Configuration.NameValueSectionHandler"/>
        </sectionGroup>
    </configSections>
    <TestGroup>
        <Test>
            <add key="Hello" value="World"/>
        </Test>
    </TestGroup>
</configuration>

下面是访问这个配置节组的代码:

NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test");
MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]);    //输出Hello World

3. 通过 IConfigurationSectionHandler 接口实现自定义配置处理类

IConfigurationSectionHandler 接口原型:

public interface IConfigurationSectionHandler
{
    Object Create(Object parent, Object configContext, XmlNode section)
}

Create 方法必须可由多个线程同时调用,即要保证线程安全。

示例代码:

    public class UrlString : IConfigurationSectionHandler
    {

        private string _action;

        public string Action
        {
            get { return _action; }
            set { _action = value; }
        }

        private string _param;

        public string Param
        {
            get { return _param; }
            set { _param = value; }
        }

        #region IConfigurationSectionHandler 成员

        public object Create(object parent, object configContext, XmlNode section)
        {
            Hashtable hashtable = new Hashtable();
            foreach (XmlAttribute attribute in section.Attributes)
            {
                hashtable[attribute.Name] = attribute.Value;
            }
            return hashtable;
        }

        #endregion

        public static UrlString Create()
        {
            UrlString us = new UrlString();
            Hashtable ht = ConfigurationManager.GetSection("UrlString") as Hashtable;
            us.Action = (string)ht["action"];
            us.Param = (string)ht["paramString"];
            return us;
        }
    }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/educast/archive/2008/09/06/2890102.aspx

posted @ 2009-07-08 19:20  kk.1230  阅读(1190)  评论(0编辑  收藏  举报