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

<test>
<testInfos>
<testInfo aa="aaKeyStr1" bb="" />
<testInfo aa="aaKeyStr2" bb="" />
</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"];

运行效果:

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

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

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

关于ConfigurationSection自定义config的简单使用的更多相关文章

  1. List<T>集合的Sort自定义排序用法简单解析

    List<T>集合的Sort自定义排序用法简单解析: 如下:一系列无序数字,如果想要他们倒序排列,则使用如下代码: 那么如何理解这段代码呢? (x,y)表示相邻的两个对象,如果满足条件:x ...

  2. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  3. 释放SQL Server占用的内存 .Net 读取xml UrlReWriter 在web.config中简单的配置

    释放SQL Server占用的内存   由于Sql Server对于系统内存的管理策略是有多少占多少,除非系统内存不够用了(大约到剩余内存为4M左右),Sql Server才会释放一点点内存.所以很多 ...

  4. Python自定义线程类简单示例

    Python自定义线程类简单示例 这篇文章主要介绍了Python自定义线程类,结合简单实例形式分析Python线程的定义与调用相关操作技巧,需要的朋友可以参考下.具体如下: 一. 代码     # - ...

  5. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  6. 在.net中读写config文件的各种方法(自定义config节点)

    http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html 阅读目录 开始 config文件 - 自定义配置节点 config文件 - ...

  7. .net 中读取自定义Config文件

    今天做一个windows插件式服务程序,插件有时要读取配置文件的设置,但是服务是动态加载到服务上的,没有办法作到动态修改服务的配置文件(app.config).在.net 2.0中有一个Configu ...

  8. salesforce 零基础学习(二十六)自定义图表chart简单介绍(使用apex和VF实现)

    chart在报表中经常使用到,他可以使报表结果更加直观的展现给用户.salesforce支持VF和apex代码来更好的展示chart. chart分类:常用的图表样式有饼状图,柱状图,折线图,条形图, ...

  9. iOS 实现Tabbarcontroller中间自定义样式 最简单的方法

    先上图: 如果我们要实现中间按钮自定义样式,方法应该蛮多,这里介绍一种最简单的. 1.创建类继承:UITabBarController,如下代码都是写在该类的 .m文件里 2.定义最中间的自定义样式, ...

随机推荐

  1. 树莓派SSH篇

    开启好树莓派后发现一个问题,怎么才可以输入进树莓派里面呢? 一.你需要和我一样准备一个无线(有线)键盘

  2. CTF比赛时准备的一些shell命令

    防御策略: sudo service apache2 start :set fileformat=unix1.写脚本关闭大部分服务,除了ssh       2.改root密码,禁用除了root之外的所 ...

  3. 【JavaEE】之SSM入门项目的搭建

    最近学习了一下SSM.SSM是 Spring + SpringMVC + MyBatis 整合框架,非常适合WEB后台开发,也是当前很多人的不二选择.这篇博客带大家来创建一个学习SSM的入门程序,从搭 ...

  4. 远程连接mysql出现1045错误的解决办法

    第一步:停止MySQL服务 第二步:在你MySQL的安装目录下找到my.ini,文件,打开文件查找到 [mysqld] ,在其下方添加上一行 skip-grant-tables,然后保存. 第三步:启 ...

  5. python中random的基本用法

    那么怎么使 a 随机生成一个数值呢,来研究一下random的部分程序:python中random模块的几个函数可以随机生成数值,下面咱们看一下random的几个函数的使用方法. random()是不能 ...

  6. bash中$符号的一般用法

    $一般用于获取变量的内容(字符串或数字等),用以构成命令version=$(uname -r).构成字符串echo "my name is $myname".进行算术运算等tota ...

  7. mint UI MessageBox 使用

    一.全局注册 1.在main.js中引入 //引入 import { MessageBox } from 'mint-ui';   //全局使用,挂载到原型上 Vue.prototype.$messa ...

  8. Java修炼——接口详解_接口的特征_使用接口的意义

    接口中可以包含的内容: 抽象法和非抽象方法(jdk1.8,必须使用default的关键字),属性(public static final)常量. 接口和类的关系 1.(继承了接口)类必须去实现接口中的 ...

  9. 用Java编程语言对一个无序整形数组进行排序(冒泡排序,选择排序,插入排序)

    public static void main(String[] args) { /** * 冒泡排序 * 思路:每个轮次都让第一个数和其后所有的数进行轮比较,如果这轮的第一个数大则和其下一个数交换位 ...

  10. [TimLinux] JavaScript 引用类型——Date

    1. Date var now = new Date(); // 不传参数,获取当前日期.时间. now.getDay(); // 日期 now.getMonth(); // 月份 now.getFu ...