C#除了appSettings和connectionStrings默认配置外还允许用户自定义使用配置。C# 提供3中简单的自定义配置,配置文件如下

  

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="Config1" type="System.Configuration.SingleTagSectionHandler"/>
  5. <section name="Config2" type="System.Configuration.DictionarySectionHandler"/>
  6. <section name="Config3" type="System.Configuration.NameValueSectionHandler"/>
  7. </configSections>
  8. <Config1 a="1" b="2"/>
  9. <Config2>
  10. <add key="a" value="1"/>
  11. <add key="b" value="2"/>
  12. </Config2>
  13. <Config3>
  14. <add key="a" value="1"/>
  15. <add key="b" value="2"/>
  16. </Config3>
  17. </configuration>

  使用这3种中配置要注意:

  1.  configSections节点必须要是配置的第一个节点。

  2. 自定义配置要在configSections内部声明。格式是<section name="配置名" type="类的全路径,dll名"/> 系统的这3种配置dll省略。

   3. 针对以上3种配置格式不能变,不能变,不能变,重要的事说3遍 。<Config1 a="1" b="2"></Config1 > 这种写法 抛出异常。

  这3中使用也比较简单,用ConfigurationManager.GetSection(XXX)获取节点数据。第一种和第二种都返回Hashtable类型(Hashtable实现IDictionary接口),第三种返回NameValueCollection 与appSettings返回类型相同。

  

  1. public static void Main(string[] args)
  2. {
  3. // Hashtable
  4. Hashtable config1 = (Hashtable)ConfigurationManager.GetSection("Config1");
  5. Dictionary<string, string> c = new Dictionary<string, string>();
  6. Console.WriteLine("****************配置1**********************");
  7. Console.WriteLine("遍历");
  8. foreach (DictionaryEntry g in config1)
  9. {
  10. Console.WriteLine(g.Key + "=" + g.Value);
  11. }
  12. Console.WriteLine("使用:a=" + config1["a"]);
  13.  
  14. Hashtable config2 = (Hashtable)ConfigurationManager.GetSection("Config2");
  15. Console.WriteLine("****************配置2**********************");
  16. Console.WriteLine("遍历");
  17. foreach (DictionaryEntry g in config1)
  18. {
  19. Console.WriteLine(g.Key + "=" + g.Value);
  20. }
  21. Console.WriteLine("使用:a=" + config1["a"]);
  22.  
  23. Console.WriteLine("****************配置3**********************");
  24. NameValueCollection config3 = (NameValueCollection)ConfigurationManager.GetSection("Config3");
  25. Console.WriteLine("遍历");
  26. foreach (var item in config3.AllKeys)
  27. {
  28. Console.WriteLine(item + "=" + config3[item]);
  29. }
  30. Console.WriteLine("使用:a=" + config3["a"]);
  31.  
  32. Console.ReadLine();
  33. }

获取配置

 调试结果:

  接下来我们来讲讲如何使用自己格式的配置方法,

  一.建立一个配置文件 如下

  

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="MyConfig" type="CustomConfig.MyConfig.ConfigHandler,CustomConfig" />
  5. </configSections>
  6.  
  7. <MyConfig c="3">
  8. <a>1</a>
  9. <b>2</b>
  10. </MyConfig>
  11.  
  12. </configuration>

  确定数据格式和解析类。

  二.解析类

  

  1. namespace CustomConfig.MyConfig
  2. {
  3. public class ConfigHandler : IConfigurationSectionHandler
  4. {
  5. public object Create(object parent, object configContext, XmlNode section)
  6. {
  7. ConfigModel model = new ConfigModel //根据需要的类型来返回
  8. {
  9. a = section.SelectSingleNode("/MyConfig/a").InnerText,
  10. b = section.SelectSingleNode("/MyConfig/b").InnerText,
  11. c = section.SelectSingleNode("/MyConfig").Attributes.GetNamedItem("c").Value
  12. };
  13. return model;
  14. }
  15. }
  16.  
  17. public class ConfigModel
  18. {
  19. public string a { get; set; }
  20. public string b { get; set; }
  21. public string c { get; set; }
  22. }
  23. }

  1.配置解析类要实现 IConfigurationSectionHandler j接口  Create函数为具体解析函数,XmlNode section 包含节点全部数据

  2.确定数据的返回格式如 ConfigModel,可根据需要编写。

  3.解析方法和解析Xml相同。

  三. 取配置数据

  方法与之前相同一样用ConfigurationManager.GetSection(XXX)函数 ,执行时会自动调用解析类。

  

  1. public static void Main(string[] args)
  2. {
  3. ConfigModel config = (ConfigModel)ConfigurationManager.GetSection("MyConfig");
  4. Console.WriteLine(config.a + "," + config.b + "," + config.c);
  5. }

  

  

C# 快捷使用自定义配置节点的更多相关文章

  1. VS2012 常用web.config配置解析之自定义配置节点

    在web.config文件中拥有一个用户自定义配置节点configSections,这个节点可以方便用户在web.config中随意的添加配置节点,让程序更加灵活(主要用于第三方插件的配置使用) 自定 ...

  2. App.config和Web.config配置文件的自定义配置节点

    前言 昨天修改代码发现了一个问题,由于自己要在WCF服务接口中添加了一个方法,那么在相应调用的地方进行更新服务就可以了,不料意外发生了,竟然无法更新.左查右查终于发现了问题.App.config配置文 ...

  3. ASP.NET系列:自定义配置节点的复用

    appSettings太简单,为每个程序自定义配置节点太复杂,因此要解决app.config&web.config自定义配置的复用问题. 1.读取不依赖SectionName,根节点可以定义为 ...

  4. 自定义配置节点configSections的使用

    //App.config <?xml version="1.0" encoding="utf-8" ?><configuration>  ...

  5. .Net 配置文件--继承ConfigurationSection实现自定义处理类处理自定义配置节点

    除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个 ...

  6. .Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点

    除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个 ...

  7. C#创建自定义配置节点

    转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...

  8. App.Config自定义配置节点

    配置文件: <?xml version="1.0" encoding="utf-8"?> <configuration> <con ...

  9. .NET中如何自定义配置节点

    .NET Framework在web.config或app.config中默认提供了很多种设置,以便能够改变应用程序内嵌组件的行为,例如<connectionStrings>.<ht ...

随机推荐

  1. 当一个元素被浮动后,它的display是否会被默认指定为block?

    css 浮动后的元素不论是什么display的都默认是block就是设置inline也是block IE/6出现双边框的原因 出现双边距的条件是当浮动元素的浮动方向和margin的方向一致时才会出现. ...

  2. 51nod 1717 好数 (水题)

    题目: 看起来很复杂,其实就是有多少个素因子就翻转多少次. 然后考虑到只有平方数有奇数个素因子. 一次过,上代码把: #include <iostream> #include <al ...

  3. HttpWebRequest WebExcepton: The remote server returned an error: (407) Proxy Authentication Required.

    1. Supply the credentials of the Currently Logged on User to the Proxy object similar to this: // Be ...

  4. 解决maven 无法下载java-memcached的依赖问题

    1.进入https://github.com/gwhalin/Memcached-Java-Client/downloads 下载java-memcached的jar包. 2.使用cmd进入maven ...

  5. 优动漫PAINT-牵牛花画法教程

    喇叭型对画者自身的塑形功力会有较高的要求,作者很靠谱的把他的塑形方式详细呈现了出来~ 对于这样的一个仿真效果的牵牛花完全可以使用优动漫PAINT完成,简单又快捷,软件下载:http://www.don ...

  6. 一个简单的MyBatis项目(应用)

    ### 1. MYBATIS简介  MYBATIS是持久层框架,大大的简化了持久层开发.  当使用MYBATIS框架时,开发人员不必再编写繁琐的JDBC代码,只需要定义好每个功能对应的抽象方法与需要执 ...

  7. mysql 将时间转换成时间戳

    select UNIX_TIMESTAMP(addtime/*date_column*/) from tablename 输出:1548658912 数据库原格式:2019-01-28 15:01:2 ...

  8. 多任务-进程之进程池Pool

    1.什么是池? 首先从字面上看,池代表着一个容器,用来承载着某些内容的容器,了解到这里,就对进程池有了一个初步的轮廓. 2.什么是进程池Pool? (1)利用现实中的事物来理解: 对于小白初学者,接触 ...

  9. ocrsearch的横屏转竖屏的解决方案

    //这是其中解决预览图的一部分(坑了好久的)@Override public void onPreviewFrame(byte[] data, Camera camera) { Size previe ...

  10. const int *a与int *const a,const int *const a的区别

    来源:https://blog.csdn.net/zhangheng837964767/article/details/33783511 关键问题点:const 属于修饰符 ,关键是看const 修饰 ...