除了使用.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啥的形式。

其实配置文件刚开始看起来是这样的:

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

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

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

  2. SharePoint REST API - 使用REST接口对列表设置自定义权限

    博客地址:http://blog.csdn.net/FoxDave SharePoint网站.列表和列表项都属于SecurableObject类型.默认情况下,一个安全对象继承父级的权限.对一个对 ...

  3. AIDL安卓接口定义语言

    Android    Interface Definition  Language简称AIDL翻译为 :安卓       接口      定义        语言 AIDL:进程间通信.Android ...

  4. 基于动态代理的WebAPI/RPC/webSocket框架,一套接口定义,多个通讯方式

    API/RPC/webSocket三个看起来好像没啥相同的地方,在开发时,服务端,客户端实现代码也大不一样 最近整理了一下,通过动态代理的形式,整合了这些开发,都通过统一的接口约束,服务端实现和客户端 ...

  5. Spring事务管理接口定义

    Spring事务管理接口介绍 Spring事务管理接口: PlatformTransactionManager: (平台)事务管理器 TransactionDefinition: 事务定义信息(事务隔 ...

  6. AIDL —— Android接口定义语言

    AIDL:Android Interface Definition Language,即Android接口定义语言,是Android进程间通信比较常用的一种方式.翻译一下,就是为了让某个Service ...

  7. Java 8新特性-2 接口定义增强

    为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的  ...

  8. java数据结构_附11_图的接口定义

    图的接口定义 Graph public class UnsupportedOperation extends RuntimeException {public UnsupportedOperation ...

  9. [Asp.net 5] Configuration-新一代的配置文件(接口定义与基础实现)

    关于配置文件的目录:[Asp.net 5] Configuration-新一代的配置文件 本系列文章讲的是asp.net 5(Asp.net VNext)中的配置文件部分,工程下载地址为:https: ...

随机推荐

  1. 在Ubuntu / Ubuntu Kylin下安装和卸载 Nodepadqq

    在Ubuntu / Ubuntu Kylin下安装和卸载 Nodepadqq         对于Ubuntu发行版本可以通过PPA安装,命令如下: sudo add-apt-repository p ...

  2. LeetCode OJ——Climbing Stairs

    http://oj.leetcode.com/problems/climbing-stairs/ 走台阶的题目,转换出数学模型之后,就是Fibonacci数列.后一个数等于前两个数的和. 递归版本超时 ...

  3. js-解决移动端点击事件的延迟问题

    众所周知,在手机上的点击事件会有延迟300ms的问题.但在做手机端某些点击小游戏时,我们就需要取消这个延迟的问题: 第一步:禁止页面的缩放 <meta name="viewport&q ...

  4. [原创][FPGA]有限状态机FSM学习笔记(一)

    1. 概述--何为有限状态机FSM? 有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常 ...

  5. 着陆攻击LAND Attack

    着陆攻击LAND Attack   着陆攻击LAND Attack也是一种拒绝服务攻击DOS.LAND是Local Area Network Denial的缩写,意思是局域网拒绝服务攻击,翻译为着陆攻 ...

  6. 访问权限修饰符Protected专题

    上图描述:A类在a包下,m()方法被protected修饰 上图描述:B类也在a包下,B类是A类的子类. 解析:B类和A类是同包类,B类是A类的子类,因此b对象可以调用m()方法. 上图描述:C类也在 ...

  7. js中call、apply、bind那些事2

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  8. 手动安装windows的磁盘清理工具

    All you really need to do is copy some files that are already located on your server into specific s ...

  9. Engine中如何实现鼠标滚轮缩放反置?

    来自:http://zhihu.esrichina.com.cn/?/question/6666 [解决办法]:1,禁用IMapControl的默认鼠标滚轮事件.即设置IMapControl4.Aut ...

  10. Weblogic内存溢出及常用参数配置

        http://www.360doc.com/content/14/0306/14/16134804_358216319.shtml 一.WebLogic内存溢出 最近访问量门户访问量突然增大, ...