首页 > 技术文章 > app.config 配置多项 配置集合 自定义配置(2)

birds-zhu 2016-09-29 11:43 原文

上一篇说了利用app.config自定义节点配置,那是利用工具来实现,其实也一全部编码的方式来实现.
举一个栗子.
Simpson一家有父亲James,母亲Kate,和三个儿女Jim,Aaron和Lukas.结构如下.

  <family surname="Simpson">
    <father  firstName="James" lastName="Simpson"/>
    <mother  firstName="Kate" lastName="Simpson"/>
    <children >
      <add firstName="Jim" lastName="Simpson"/>
      <add firstName="Aaron" lastName="Simpson"/>
      <add firstName="Lukas" lastName="Simpson"/>
    </children>
</family>

  加在Config中像下面这个样子.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="family" type="SimpsonFamily.Config.FamilySection,SimpsonFamily"/>
  </configSections>
  <family surname="Simpson">
    <father firstName="James" lastName="Simpson"/>
    <mother firstName="Kate" lastName="Simpson"/>
    <children >
      <add firstName="Jim" lastName="Simpson"/>
      <add firstName="Aaron" lastName="Simpson"/>
      <add firstName="Lukas" lastName="Simpson"/>
    </children>
   
  </family>
</configuration>

注意上面代码中的type,"SimpsonFamily.Config.FamilySection"表示这个section的类的路径(命名空间+类名),"SimpsonFamily"其实就是程序集的名字,因为这里要用到反射.
一般还可以有 "Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"这种,这里我们省略.

接下来咱们编码:
在名为SimpsonFamily的工程中建立文件夹config,增加class ,命名 FamilySection,继承自System.Configuration.ConfigurationSection类(需要添加引用).
这个家庭的姓氏为Simpson,通过XML中的属性来实现的.father和mother通过子节点实现.而孩子们又是集合.应该这样编码.
1.增加一个新类--儿女的集合Children,继承自ConfigurationElementCollection,实现他的一些集合操作方法;

class Children : ConfigurationElementCollection
    {
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((Child)element).FirstName;
        }

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

        public Child this[int i]
        {
            get { return (Child)base.BaseGet(i); }
        }

        public Child this[string key]
        {
            get { return (Child)base.BaseGet(key); }
        }

    }

  

2.新增类:father,mother,child,有属性firstName和lastName.集成自ConfigurationElement

 class Person : ConfigurationElement
    {
        [ConfigurationProperty("firstName", IsRequired = true, IsKey = true)]
        public string FirstName
        {
            get { return (string)base["firstName"]; }
            set { base["firstName"] = value; }
        }
        [ConfigurationProperty("lastName", IsRequired = true)]
        public string LastName
        {
            get { return (string)base["lastName"]; }
            set { base["lastName"] = value; }
        }
    }
    class Mother : Person { }
    class Father : Person { }
    class Child : Person { }

  

3.新增类SimpsonFamily.Config.FamilySection,增加属性surname,增加father和mother,增加集合children(children中的type明显应为Child).

 class FamilySection : System.Configuration.ConfigurationSection
    {
        [ConfigurationProperty("surname", IsRequired = true)]
        public string Surname
        {
            get { return (string)base["surname"]; }
            set { base["surname"] = value; }
        }

        [ConfigurationProperty("father", IsDefaultCollection = false)]
        public Father Father
        {
            get { return (Father)base["father"]; }
            set { base["father"] = value; }
        }

        [ConfigurationProperty("mother", IsDefaultCollection = false)]
        public Mother Mother
        {
            get { return (Mother)base["mother"]; }
            set { base["mother"] = value; }
        }


        [ConfigurationProperty("children", IsDefaultCollection = false)]
        [ConfigurationCollection(typeof(Child), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap, RemoveItemName = "remove")]
        public Children Children
        {
            get { return (Children)base["children"]; }
            set { base["children"] = value; }
        }
    }

  

测试代码:

 

var section = (FamilySection)System.Configuration.ConfigurationManager.GetSection("family");
            string surname = section.Surname;
            Father f = section.Father;
            Mother m = section.Mother;
            for (int i = 0; i < section.Children.Count; i++)
            {
                string firstname = section.Children[i].FirstName;
                string lastname = section.Children[i].LastName;
            }

  

推荐阅读