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


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




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


       

              



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



         

                   

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









原文地址:https://www.cnblogs.com/brucemengbm/p/6758089.html