除了使用.net里面提供的内置处理程序来处理我们的自己定义节点外,我们还能够通过多种方法,来自己定义处理类处理我们的自己定义节点,本文主要介绍通过实现IConfigurationSectionHandler接口的方式来实现自己定义处理程序。

首先,我们先在配置文件中面写例如以下自己定义节点:

 <!-- 使用自己定义节点和上面的自己定义处理程序-->
<mailServerGroup provider="www.baidu.com"> <mailServer client="http://blog.csdn.net/lhc1105">
<address>13232@qq.com</address>
<userName>lhc</userName>
<password>2343254</password>
</mailServer> <mailServer client="http://www.cnblogs.com/liuhuichao/">
<address>132345232@qq.com</address>
<userName>水田如雅</userName>
<password>2343453254</password>
</mailServer> </mailServerGroup>

然后写相应类进行处理:

namespace MailHandlerClass
{
public class MailServer
{
//存储mailServer的子节点(<address>13232@qq.com</address><userName>lhc</userName><password>2343254</password>)的值
//以及client的值
private Hashtable serverNode; //构造函数
public MailServer() { serverNode = new Hashtable(); } public Hashtable ServerNode { get { return serverNode; } }
public string client { get { return serverNode["client"] as string; } }
public string Address { get { return serverNode["address"] as string; } }
public string UserName { get { return serverNode["userName"] as string; } }
public string PassWord { get { return serverNode["password"] as string; } } } //相应mailServerGroup
public class MailServerConfig : List<MailServer> {
//映射provider值
public string Provider { get; set; } } //自己定义配置节点mailServerGroup的处理程序
public class MailServerConfigurationHandler : IConfigurationSectionHandler { //section为MailServerGroup节点 public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
//设置方法返回配置对象。能够是不论什么类型
MailServerConfig config = new MailServerConfig(); //获取节点的属性信息
config.Provider = section.Attributes["provider"] == null ? "" : section.Attributes["provider"].Value; //获取MailServer节点
foreach (System.Xml.XmlNode child in section.ChildNodes)
{
MailServer server = new MailServer();
//加入Client属性
if (child.Attributes["client"]!=null)
{
server.ServerNode.Add("client", child.Attributes["client"].Value);
} //获取MailServer下的Name,username,password节点
foreach (System.Xml.XmlNode grandChild in child.ChildNodes)
{
//加入文本
server.ServerNode.Add(grandChild.Name, grandChild.InnerText);
} //将server加入MailServerConfig
config.Add(server);
} return config;
}
}
}

事实上从代码能够看出,自己定义处理类的实现思路还是用hashtable来实现key-value的读取与存储+对XML的处理;

之后,我们在配置文件中将上面的类和节点关联起来:

<configuration>

  <!--定义处理mailServerGroup配置节的类-->
<configSections>
<section name="mailServerGroup" type="MailHandlerClass.MailServerConfigurationHandler,实现IConfigurationSectionHandler接口"/> <!--【注意】type:指定用来运行例如以下操作的配置节处理程序类的名称:处理在 name 属性中指定的节或元素中的配置设置。 使用下面格式:type=" Fully qualified class name , assembly file name , version , culture , public key token "定义必须匹配程序集引用。 --> </configSections>

一定要注意type指定值时參数的位置!!

。。!不然会出现载入不上处理程序的错误。

写段代码測试下:

namespace MailHandlerClass
{
//也能够通过继承ConfigurationSection类来完毕
class Program
{
static void Main(string[] args)
{
MailServerConfig mailServerConfig = (MailServerConfig)ConfigurationManager.GetSection("mailServerGroup"); //读取节点值
mailServerConfig.ForEach(m => {
Console.WriteLine(m.client+";"+m.Address+";"+m.UserName+";"+m.PassWord);
}); }
}
}

额,事实上还是建议强转改为as啥的形式。

事实上配置文件刚開始看起来是这种:

可是学完之后,你再看配置文件,就变成了这种:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGhjMTEwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

感觉so easy~~~~么么哒~~~·

.Net——实现IConfigurationSectionHandler接口定义处理程序处理自己定义节点的更多相关文章

  1. .Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点

    除了使用.net里面提供的内置处理程序来处理我们的自定义节点外,我们还可以通过多种方法,来自己定义处理类处理我们的自定义节点,本文主要介绍通过实现IConfigurationSectionHandle ...

  2. TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts

    1,面向对象的特性一:类,继承,见上一篇博客: 2,面向对象的特性二: 泛型(generic):参数化的类型,一般用来限制集合的内容:指定只能放某个类型的元素 如下图中的尖括号中的Person,就代表 ...

  3. activiti自己定义流程之自己定义表单(二):创建表单

    注:环境配置:activiti自己定义流程之自己定义表单(一):环境配置 在上一节自己定义表单环境搭建好以后,我就正式開始尝试自己创建表单,在后台的处理就比較常规,主要是针对ueditor插件的功能在 ...

  4. 定义制造业操作(定义 MES/MOM 系统)

    定义制造业操作(定义 MES/MOM 系统) 制造业操作包含众多工厂级活动,涉及设备(定义.使用.时间表和维护).材料(识别.属性.位置和状态).人员(资格.可用性和时间表),以及这些资源与包含其信息 ...

  5. java问题:类的定义,对象的定义?

    java问题:类的定义,对象的定义? 类是一组数据和函数的集合,只是抽象的概念,它的作用就是生成对象,它生成对象后,就为这个对象分了一块存储区,类可以生成无限多个对象,每个对象都有自己的存储区,在类里 ...

  6. 配件BOM定义限制(只定义配件的)

    应用 Oracle Bill Of   Materiel 层 Level Function 函数名 Funcgtion Name BOM_BOMFDBOM 表单名 Form Name BOMFDBOM ...

  7. hbase源码系列(四)数据模型-表定义和列族定义的具体含义

    hbase是一个KeyValue型的数据库,在<hbase实战>描述它的逻辑模型[行键,列族,列限定符,时间版本],物理模型是基于列族的.但实际情况是啥?还是上点代码吧. HTableDe ...

  8. C++报错:全局变量重定义或是多次定义

    如何在C++中定义全局变量时避免重复定义呢? 只要在定义时尽量在.cpp文件中进行,而不要在.h 文件中定义,定义好了之后,可以在.h文件中利用extern关键字进行声明. 如果在.h文件中定义的话, ...

  9. dolphinscheduler简单任务定义及复杂的跨节点传参

    dolphinscheduler简单任务定义及跨节点传参 转载请注明出处 https://www.cnblogs.com/funnyzpc/p/16395094.html 写在前面 dolphinsc ...

随机推荐

  1. python特有的协程

    #转载请联系 什么是协程呢? 线程包含在进程里面,协程包含在线程里面.协程也是和进程.线程一样,可以实现多任务.协程的切换开销比线程更小,不需要保存和恢复线程的状态.最通俗易懂的说法就是,协程是就是一 ...

  2. hdu 5188(带限制的01背包)

    zhx and contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. opencv mat

    mat基础教程: http://blog.csdn.net/sinat_31802439/article/details/50083291 mat 初始化: Mat M(,,CV_32FC1); Ma ...

  4. 开源的图像滤镜库----for Android

    1.GPUImage for Android(推荐使用) GPUImage基于OpenGL实现的各种各样图像滤镜(图像处理)效果,多达50多种, idea源于GPUImage for iOS,基本囊括 ...

  5. codeforces Round #441 A Trip For Meal【思路/模拟】

    A. Trip For Meal time limit per test 1 second memory limit per test 512 megabytes input standard inp ...

  6. 百度之星资格赛 2016 Problem 1001

    本文链接http://www.cnblogs.com/Ash-ly/p/5494618.html 题意: 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来 ...

  7. ipython notebook install

    1.python install (ubuntut系统默认2.7.x) Github: https://github.com/ipython/ipython 2.sudo apt-get instal ...

  8. AMQ学习笔记 - 02. JMS客户端编程模型

    概述 客户端编程模型,是讲如何使用JMS API实现Java应用程序和JMS Provider的通信. 消息传送模式 消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub ...

  9. SHELL 在指定行的前/后插入指定内容

    #如果知道行号可以用下面的方法 sed -i '88 r b.file' a.file    #在a.txt的第88行插入文件b.txt awk '1;NR==88{system("cat ...

  10. [BZOJ 2006] 超级钢琴

    Link: https://www.lydsy.com/JudgeOnline/problem.php?id=2006 Algorithm: 对于此类区间最值类问题,我们可以通过控制一端不变来寻找当前 ...