在Net2.0以上的版本对自定义configSection是件相对容易的事情.
比如,我们要创建以下自定义的配置节ConfigSectionsLib<configuration><configSections><section name="ConfigSectionsLib" type="ConfigSectionsLib.IPSection,ConfigSectionsLib"/></configSections><ConfigSectionsLib configSource="ConfigFiles\IPAllow.config" />......<configuration>IPAllow.config文件结构如下:<?xml version="1.0" encoding="utf-8" ?><ConfigSectionsLib><IPItemElement><IPItem Name="1" IP="192.168.1.1"></IPItem><IPItem Name="2" IP="192.168.1.2"></IPItem><IPItem Name="3" IP="192.168.1.3"></IPItem><IPItem Name="4" IP="192.168.1.4"></IPItem></IPItemElement></ConfigSectionsLib>我们该如何开始呢,首先应该建个项目(名称空间为ConfigSectionsLib, DLL文件名:ConfigSectionsLib.dll)创建类:IPSection 让它继承ConfigurationSection代码如下:using System;using System.Collections.Generic;using System.Text;using System.Configuration;using System.ComponentModel;namespace ConfigSectionsLib{ public class IPSection : ConfigurationSection{ /// <summary>/// Gets the IPItemElement element./// </summary>[ConfigurationProperty("IPItemElement")]public IPItemElementCollection IPItems{ get { return (IPItemElementCollection)this["IPItemElement"]; }}}}这代表我们要创建一个IPItems属性,这个属性是个IPItemElementCollection集合,它的定义在下面:[ConfigurationCollection(typeof(IPItemElement), AddItemName = "IPItem", CollectionType = ConfigurationElementCollectionType.BasicMap)]public class IPItemElementCollection : ConfigurationElementCollection{ public IPItemElement this[int index]{ get { return (IPItemElement)base.BaseGet(index); }set{ if (base.BaseGet(index) != null){ base.BaseRemoveAt(index);}base.BaseAdd(index, value);}}public new IPItemElement this[string name]{ get { return (IPItemElement)base.BaseGet(name); }}protected override ConfigurationElement CreateNewElement(){ return new IPItemElement();}protected override object GetElementKey(ConfigurationElement element){ return (element as IPItemElement).Name;}public override ConfigurationElementCollectionType CollectionType{ get { return ConfigurationElementCollectionType.BasicMap; }}protected override string ElementName{ get { return "IPItem"; }}}如果想创建跟appSettings和connectionStrings一样的配置节,就是由<add/>子节组成的配置节,你可以这样定义IPItemElementCollection[ConfigurationCollection(typeof(IPItemElement), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]public class IPItemElementCollection : ConfigurationElementCollection{ public IPItemElement this[int index]{ get { return (IPItemElement)base.BaseGet(index); }set{ if (base.BaseGet(index) != null){ base.BaseRemoveAt(index);}base.BaseAdd(index, value);}}public new IPItemElement this[string name]{ get { return (IPItemElement)base.BaseGet(name); }}protected override ConfigurationElement CreateNewElement(){ return new IPItemElement();}protected override object GetElementKey(ConfigurationElement element){ return (element as IPItemElement).Name;} // 将下面的注释// public override ConfigurationElementCollectionType CollectionType// { // get { return ConfigurationElementCollectionType.BasicMap; }// }// protected override string ElementName// { // get { return "IPItem"; }// } }这种形式的配置节将以以下的形式出现:<ConfigSectionsLib><IPItemElement><Add Name="1" IP="192.168.1.1"></Add><Add Name="2" IP="192.168.1.2"></Add><Add Name="3" IP="192.168.1.3"></Add><Add Name="4" IP="192.168.1.4"></Add></IPItemElement></ConfigSectionsLib>剩下的就是IPItemElement的定义:public class IPItemElement : ConfigurationElement{ [ConfigurationProperty("Name", DefaultValue = "")]public string Name{ get { return this["Name"] as string; }}[ConfigurationProperty("IP", DefaultValue = "")]public string IP{ get { return this["IP"] as string; }}}这样就大功告成了,我们就可以写个类来封装对它的访问:public class CustomIP{ private string mName;public string Name{ get { return mName; }set { mName = value; }}private string mIP;public string IP{ get { return mIP; }set { mIP = value; }}}public class SectionSetting{ static IPSection ipSection = ConfigurationManager.GetSection("ConfigSectionsLib") as IPSection;public static List<CustomIP> GetCustomIPList(){ List<CustomIP> lst = new List<CustomIP>();foreach (IPItemElement item in ipSection.IPItems){ CustomIP cip = new CustomIP();cip.IP = item.IP;cip.Name = item.Name;lst.Add(cip);}//这边返回的就是所有子节的集合return lst;}}