上一篇说了利用app.config自定义节点配置,那是利用工具来实现,其实也一全部编码的方式来实现.
举一个栗子.
Simpson一家有父亲James,母亲Kate,和三个儿女Jim,Aaron和Lukas.结构如下.

  1. <family surname="Simpson">
  2. <father firstName="James" lastName="Simpson"/>
  3. <mother firstName="Kate" lastName="Simpson"/>
  4. <children >
  5. <add firstName="Jim" lastName="Simpson"/>
  6. <add firstName="Aaron" lastName="Simpson"/>
  7. <add firstName="Lukas" lastName="Simpson"/>
  8. </children>
  9. </family>

  加在Config中像下面这个样子.

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="family" type="SimpsonFamily.Config.FamilySection,SimpsonFamily"/>
  5. </configSections>
  6. <family surname="Simpson">
  7. <father firstName="James" lastName="Simpson"/>
  8. <mother firstName="Kate" lastName="Simpson"/>
  9. <children >
  10. <add firstName="Jim" lastName="Simpson"/>
  11. <add firstName="Aaron" lastName="Simpson"/>
  12. <add firstName="Lukas" lastName="Simpson"/>
  13. </children>
  14.  
  15. </family>
  16. </configuration>

注意上面代码中的type,"SimpsonFamily.Config.FamilySection"表示这个section的类的路径(命名空间+类名),"SimpsonFamily"其实就是程序集的名字,因为这里要用到反射.
一般还可以有 "Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"这种,这里我们省略.

接下来咱们编码:
在名为SimpsonFamily的工程中建立文件夹config,增加class ,命名 FamilySection,继承自System.Configuration.ConfigurationSection类(需要添加引用).
这个家庭的姓氏为Simpson,通过XML中的属性来实现的.father和mother通过子节点实现.而孩子们又是集合.应该这样编码.
1.增加一个新类--儿女的集合Children,继承自ConfigurationElementCollection,实现他的一些集合操作方法;

  1. class Children : ConfigurationElementCollection
  2. {
  3. protected override object GetElementKey(ConfigurationElement element)
  4. {
  5. return ((Child)element).FirstName;
  6. }
  7.  
  8. protected override ConfigurationElement CreateNewElement()
  9. {
  10. return new Child();
  11. }
  12.  
  13. public Child this[int i]
  14. {
  15. get { return (Child)base.BaseGet(i); }
  16. }
  17.  
  18. public Child this[string key]
  19. {
  20. get { return (Child)base.BaseGet(key); }
  21. }
  22.  
  23. }

  

2.新增类:father,mother,child,有属性firstName和lastName.集成自ConfigurationElement

  1. class Person : ConfigurationElement
  2. {
  3. [ConfigurationProperty("firstName", IsRequired = true, IsKey = true)]
  4. public string FirstName
  5. {
  6. get { return (string)base["firstName"]; }
  7. set { base["firstName"] = value; }
  8. }
  9. [ConfigurationProperty("lastName", IsRequired = true)]
  10. public string LastName
  11. {
  12. get { return (string)base["lastName"]; }
  13. set { base["lastName"] = value; }
  14. }
  15. }
  16. class Mother : Person { }
  17. class Father : Person { }
  18. class Child : Person { }

  

3.新增类SimpsonFamily.Config.FamilySection,增加属性surname,增加father和mother,增加集合children(children中的type明显应为Child).

  1. class FamilySection : System.Configuration.ConfigurationSection
  2. {
  3. [ConfigurationProperty("surname", IsRequired = true)]
  4. public string Surname
  5. {
  6. get { return (string)base["surname"]; }
  7. set { base["surname"] = value; }
  8. }
  9.  
  10. [ConfigurationProperty("father", IsDefaultCollection = false)]
  11. public Father Father
  12. {
  13. get { return (Father)base["father"]; }
  14. set { base["father"] = value; }
  15. }
  16.  
  17. [ConfigurationProperty("mother", IsDefaultCollection = false)]
  18. public Mother Mother
  19. {
  20. get { return (Mother)base["mother"]; }
  21. set { base["mother"] = value; }
  22. }
  23.  
  24. [ConfigurationProperty("children", IsDefaultCollection = false)]
  25. [ConfigurationCollection(typeof(Child), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap, RemoveItemName = "remove")]
  26. public Children Children
  27. {
  28. get { return (Children)base["children"]; }
  29. set { base["children"] = value; }
  30. }
  31. }

  

测试代码:

  1. var section = (FamilySection)System.Configuration.ConfigurationManager.GetSection("family");
  2. string surname = section.Surname;
  3. Father f = section.Father;
  4. Mother m = section.Mother;
  5. for (int i = 0; i < section.Children.Count; i++)
  6. {
  7. string firstname = section.Children[i].FirstName;
  8. string lastname = section.Children[i].LastName;
  9. }

  

app.config 配置多项 配置集合 自定义配置(2)的更多相关文章

  1. app.config 配置多项 配置集合 自定义配置

    C#程序的配置文件,使用的最多的是appSettings 下的<add key="Interval" value="30"/>,这种配置单项的很方便 ...

  2. app.config 配置多项 配置集合 自定义配置(3)

    再说说利用app.config配置多个自定义的方法.先看这个例子:美国家庭Simpson的家里有父亲母亲和三个儿女,而中国的老王只有独生子女.结构如下: <?xml version=" ...

  3. app.config 配置多项 配置集合 自定义配置(4) 自动增加配置项到配置文件的两种方法

    一,按照xml文件处理: 配置文件如下图(最后的图片). 自动写入configSections和configSections的实例 1.自动写入configSections Configuration ...

  4. C# 读取app.config配置文件节点键值,提示"配置系统未能初始化" 错误的解决方案

    MSDN里写到, 如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素. 将自己添加的appSettin ...

  5. C# App.config 自定义 配置节 报错“配置系统未能初始化” 解决方法

    App.config,结果运行的时候出现了 "配置系统未能初始化" 的错误.找了半天才发现是下面的原因造成的: "如果配置文件中包含configSections元素,则c ...

  6. web.config or app.config 中configSections配置节点

    以前还真没见过,今天看项目中有在用,简单写了个Demo,这样配置的好处就是可以自定义配置,更加模块化,直接上代码; 1.配置文件 由于我创建的是一个控制台项目,所以配置文件是App.Config:(这 ...

  7. 【flask】flask项目配置 app.config

    [理论] 在很多情况下,你需要设置程序的某些行为,这时你就需要使用配置变量.在Flask中,配置变量就是一些大写形式的Python变量, 你也可以称之为配置参数或配置键.使用统一的配置变量可以避免在程 ...

  8. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  9. C# App.config 详解

      读语句: String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: Configuration cfa = ...

随机推荐

  1. Sql语句varchar或nvarchar字段条件前加N的性能差异

    Sql语句varchar或nvarchar字段条件前加N的话是对这个字段进行Unicode编码, 这样做的目的是避免在这种字段中存入俄文.韩文.日文的情况下有可能会出现乱码. 但这样做也会有性能问题, ...

  2. es6零基础学习之构建脚本(二)

    编译器打开你的es6项目 首先:创建我们的第一个脚本,tasks/util/args.js      在文件里面要先引入一个包,处理命令行参数 import yargs from 'yargs'; / ...

  3. 数据迁移过程中hive sql调优

    本文记录的是,在数据处理过程中,遇到了一个sql执行很慢,对一些大型的hive表还会出现OOM,一步一步通过参数的设置和sql优化,将其调优的过程. 先上sql ) t where t.num =1) ...

  4. 【Java核心】ClassLoader原理及其使用

    又把博客的皮肤换了换,看着更加简洁舒心一些.前段的知识只是略懂,拿过来就能用,只是自己的审美和设计水平有限,实在难以弄出自己特别满意的东西,也算是小小的遗憾吧!言归正传,由于最近涉及到Java核心的东 ...

  5. ASP.NET Core 处理 404 Not Found

    问题 在没有修改任何配置的情况下,这是用户使用 Chrome 访问不存在的URL时会看到的内容: 幸运的是,处理错误状态代码非常简单,我们将在下面介绍三种技术. 解决方案 在以前的ASP.NET MV ...

  6. Mybatis Sql片段的应用

    在一个查询里,针对各种不同数据库,有时候只是一部分 SQL 是不相同的,为避免相同的部分复制多次,所以将不相同的部分进行适当的隔离,再重用就可以了. 在 MyBatis 里声明两段 <sql d ...

  7. windows下LINUX模拟终端Cypwin以及Vim的配置使用

    Cypwin的安装 从官网下载相应版本后,直接安装. 官网地址:Cypwin 安装过程中可以选择相应的Packages,我们需要安装的Vim就需要在这一步中选择相应的包. Cypwin的使用 纯命令行 ...

  8. win10 uwp 访问解决方案文件

    本文讲如何访问解决方案的资源. 我们经常会把一些图片资源放在我们的解决方案,那么从这里拿出来很简单. 我在 Assets 放了图片 1.jpg 那么我要把他拿出来可以 <Image Source ...

  9. HTML5之appcache语法理解/HTML5应用程序缓存/manifest缓存文件官方用法翻译

    习惯性的贴几个参考链接: W3School-HTML 5 应用程序缓存 官方 MDN window.applicationCache 接口文档 官方 MDN 用法示例 看所有的教程不如直接看最原始的官 ...

  10. samba服务:为在windows下操作linux的文件而生

    vi/vim编辑器好玩吗?虽有着层出不穷的语法糖但又如何与传统的sublime相媲美? 那么,来吧~ 动手跟我一起做个samba服务吧~   安装   yum -y install samba  配置 ...