欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于ConfigurationSection自定义config的简单使用

程序员文章站 2022-05-03 12:48:56
1.1、自定义config结构(参考对应颜色标注),放到configuration根节点下:

1.1、自定义config结构(参考对应颜色标注),放到configuration根节点下:

<test>
  <testinfos>
    <testinfo aa="aakeystr1" bb="111111" />
    <testinfo aa="aakeystr2" bb="222222" />
  </testinfos>
  <testc cc="ccstr" />
</test>

推荐独立文件引用:

将1.1中自定义config新建为xml文件,命名:test.config

configuration根节点下添加:

<test configsource="test.config" />

1.2、config文件下需添加对应配置:

configsections节点下添加,name为自定义config的根节点,type为根节点类的命名空间.类名, 命名空间

<section name="test" type="cmdtest.testconfigurationsection, cmdtest" />

2、创建根节点类testconfigurationsection,继承configurationsection,对应自定义config中test节点:

    public class testconfigurationsection : configurationsection
    {
        [configurationproperty("testinfos", isdefaultcollection = true)]
        public testinfoelementcollection contractinfos
        {
            get
            {
                return (testinfoelementcollection)base["testinfos"]; // 子列表节点
            }
        }
        [configurationproperty("testc", isdefaultcollection = true)]
        public testcelement testc
        {
            get
            {
                return (testcelement)base["testc"]; // 单个子节点
            }
        }
    }

3.1、(子节点为集合时使用)创建子节点collection类,继承configurationelementcollection,对应自定义config中testinfos节点:

    public class testinfoelementcollection : configurationelementcollection
    {

        protected override configurationelement createnewelement()
        {
            return new testinfoelement();
        }

        protected override object getelementkey(configurationelement element)
        {
            return ((testinfoelement)element).aa; // 指定aa属性为唯一索引
        }
        public override configurationelementcollectiontype collectiontype
        {
            get
            {
                return configurationelementcollectiontype.basicmap;
            }
        }
        protected override string elementname
        {
            get
            {
                return "testinfo"; // 子节点名称
            }
        }
    }

3.2、创建列表子元素类,继承configurationelement(单个子节点均可继承此类),对应自定义config中testinfo节点:

    public class testinfoelement : configurationelement
    {
        [configurationproperty("aa", isrequired = true)] // 是否必填
        public string aa
        {
            get
            {
                return (string)base["aa"]; // 节点属性名称
            }
        }

        [configurationproperty("bb")]
        public string bb
        {
            get
            {
                return (string)base["bb"];
            }
        }
    }

4、(子节点为单个节点时使用)同3.2,对应自定义config中testc节点:

    public class testcelement : configurationelement
    {
        [configurationproperty("cc", isrequired = true)]
        public string cc
        {
            get
            {
                return (string)base["cc"];
            }
        }
    }

5、调用代码demo:

var tcs = (testconfigurationsection)configurationmanager.getsection("test");
// 读取单个子节点
var testc = tcs.testc;
// 读取list节点
dictionary<string, string> list = new dictionary<string, string>();
foreach (testinfoelement item in tcs.contractinfos)
{
    list.add(item.aa, item.bb);
}
var aa = list["aakeystr1"];

运行效果:

关于ConfigurationSection自定义config的简单使用

 

心得:我理解的自定义config无非就是将节点抽象成对象属性,对应的属性需继承相关父类进行读取,对象类的结构需与config结构对应;编写时遇到复杂的config需注意树的深度以及节点、属性对应名称,容易写错,需细心

附上示例源码地址:https://gitee.com/gongqun/testrun/tree/develop/

如有错误,请指正,谢谢!