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

简介:              除了使用.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~~~~么么哒~~~·









目录
相关文章
|
5天前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
29 13
|
29天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
86 13
|
3月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
4月前
|
Ubuntu 持续交付 API
如何使用 dotnet pack 打包 .NET 跨平台程序集?
`dotnet pack` 是 .NET Core 的 NuGet 包打包工具,用于将代码打包成 NuGet 包。通过命令 `dotnet pack` 可生成 `.nupkg` 文件。使用 `--include-symbols` 和 `--include-source` 选项可分别创建包含调试符号和源文件的包。默认情况下,`dotnet pack` 会先构建项目,可通过 `--no-build` 跳过构建。此外,还可以使用 `--output` 指定输出目录、`-c` 设置配置等。示例展示了创建类库项目并打包的过程。更多详情及命令选项,请参考官方文档。
260 11
|
3月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
137 0
|
4月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
4月前
|
自然语言处理 C# 图形学
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
|
5月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
5月前
|
开发框架 NoSQL .NET
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
|
6天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统