除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果。

首先说下.Net配置文件中一个潜规则:

在配置节点时,对于想要进行存储的参数数据,可以采用两种方式:一种是存储到节点的属性中,另一种是存储在节点的文本中。

因为一个节点可以有很多属性,但是只要一个innertext,而要在程序中将这两种形式区分开会带来复杂性。 为了避免这个问题,.net的配置文件只是用属性存储而不使用innertext.

接着,我们来写一个符合这个潜规则的自定义配置文件,方便测试:

1
2
3
4
5
6
7
8
<mailservergroup provider="www.baidu.com">
    <mailservers>
      <mailserver address="13232@qq.com" client="http://blog.csdn.net/lhc1105" password="2343254" username="lhc">
      <mailserver address="132wdfgdsggtaewg32@qq.com" client="http://blog345.csdn.net/lhc1105" password="2334t243的萨芬234254" username="dfshs水田如雅">
      <mailserver address="132wdgadsfgdtaewg32@qq.com" client="http://blog436.csdn.net/lhc1105" password="23ewrty2343的萨芬234254" username="sdfhdfs水田如雅">
      <mailserver address="132wdgdfagdstaewg32@qq.com" client="http://blo345734g.csdn.net/lhc1105" password="23erwt43的萨芬234254" username="sdfher水田如雅">
    </mailserver></mailserver></mailserver></mailserver></mailservers>
  </mailservergroup>

接着,我们来写相应的处理类,这里我们由内向外来写:

首先是最内层的mailServer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/// <summary>
   /// Class MailServerElement:用于映射mailServer节点,这里是实际存储数据的地方;
   /// </summary>
   /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:51:57</remarks>
   public sealed class MailServerElement : ConfigurationElement  //配置文件中的配置元素
   {
 
       /// <summary>
       /// Gets or sets the client.
       /// </summary>
       /// <value>The client.</value>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:40</remarks>
       [ConfigurationProperty("client", IsKey = true, IsRequired = true)]  //client是必须的key属性,有点儿主键的意思,例如,如果定义多个client相同的节点,循环读取的话就只读取到最后一个值
       public string Client
       {
           get
           {
               return this["client"] as string;
           }
           set
           {
               this["client"] = value;
           }
 
       }
       /// <summary>
       /// Gets or sets the address.
       /// </summary>
       /// <value>The address.</value>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:38</remarks>
       [ConfigurationProperty("address")]
       public string Address
       {
           get
           {
               return this["address"] as string;
           }
           set
           {
               this["address"] = value;
           }
 
       }
       /// <summary>
       /// Gets or sets the name of the user.
       /// </summary>
       /// <value>The name of the user.</value>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:35</remarks>
       [ConfigurationProperty("userName")]
       public string UserName
       {
 
           get
           {
               return this["userName"] as string;
           }
           set
           {
               this["userName"] = value;
           }
 
       }
       /// <summary>
       /// Gets or sets the password.
       /// </summary>
       /// <value>The password.</value>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:33</remarks>
       [ConfigurationProperty("password")]
       public string Password
       {
 
           get
           {
               return this["password"] as string;
           }
           set
           {
               this["password"] = value;
           }
 
       }
 
 
 
   }

接着是mailServers,它是一个mailServer的集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/// <summary>
   /// Class MailServerCollection:映射mailServers节点,为一个集合类,另外还包含了很多对节点的操作方法,大部分继承自ConfigurationElementCollection
   /// </summary>
   /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:52:00</remarks>
   public sealed class MailServerCollection : ConfigurationElementCollection
   {
       /// <summary>
       /// 获取 <see cref="T:System.Configuration.ConfigurationElementCollection"> 的类型。
       /// </see></summary>
       /// <value>The type of the collection.</value>
       /// <returns>此集合的 <see cref="T:System.Configuration.ConfigurationElementCollectionType">。</see></returns>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:08</remarks>
       public override ConfigurationElementCollectionType CollectionType
       {
           get
           {
               return ConfigurationElementCollectionType.BasicMap;
           }
         
       }
 
 
       /// <summary>
       /// 当在派生的类中重写时,创建一个新的 <see cref="T:System.Configuration.ConfigurationElement">。
       /// </see></summary>
       /// <returns>新的 <see cref="T:System.Configuration.ConfigurationElement">。</see></returns>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:03</remarks>
       protected override ConfigurationElement CreateNewElement()
       {
           return new MailServerElement();
       }
 
       /// <summary>
       /// 在派生类中重写时获取指定配置元素的元素键。
       /// </summary>
       ///<param name="element">要为其返回键的 <see cref="T:System.Configuration.ConfigurationElement">。
       /// <returns>一个 <see cref="T:System.Object">,用作指定 <see cref="T:System.Configuration.ConfigurationElement"> 的键。</see></see></returns>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:04:51</remarks>
       protected override object GetElementKey(ConfigurationElement element)
       {
           return (element as MailServerElement).Client;
       }
 
       /// <summary>
       /// 获取在派生的类中重写时用于标识配置文件中此元素集合的名称。
       /// </summary>
       /// <value>The name of the element.</value>
       /// <returns>集合的名称;否则为空字符串。默认值为空字符串。</returns>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:41:40</remarks>
       protected override string ElementName
       {
           get
           {
               return "mailServer";
           }
       }
 
 
       /// <summary>
       /// 获取集合中的元素数。
       /// </summary>
       /// <value>The count.</value>
       /// <returns>集合中的元素数。</returns>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:08:24</remarks>
       public new int Count
       {
           get { return base.Count; }
       }
 
       /// <summary>
       /// 获取或设置此配置元素的属性、特性或子元素。
       /// </summary>
       ///<param name="index">The index.
       /// <returns>MailServerElement.</returns>
       /// <remarks>Editor:v-liuhch</remarks>
       public MailServerElement this[int index]
       {
 
           get { return BaseGet(index) as MailServerElement; }
           set
           {
               if (BaseGet(index) != null)
               {
                   BaseRemoveAt(index);
               }
               BaseAdd(index, value);
           }
 
       }
 
       /// <summary>
       /// 获取或设置此配置元素的属性、特性或子元素。
       /// </summary>
       ///<param name="Name">The name.
       /// <returns>MailServerElement.</returns>
       /// <remarks>Editor:v-liuhch</remarks>
       new public MailServerElement this[string Name]
       {
           get { return BaseGet(Name) as MailServerElement; }
       }
 
       /// <summary>
       /// Indexes the of.
       /// </summary>
       ///<param name="element">The element.
       /// <returns>System.Int32.</returns>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:24:16</remarks>
       public int IndexOf(MailServerElement element)
       {
 
           return BaseIndexOf(element);
       }
 
       /// <summary>
       /// Adds the specified element.
       /// </summary>
       ///<param name="element">The element.
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:26:06</remarks>
       public void Add(MailServerElement element)
       {
           BaseAdd(element);
       }
 
       /// <summary>
       /// Removes the specified element.
       /// </summary>
       ///<param name="element">The element.
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:27:01</remarks>
       public void Remove(MailServerElement element)
       {
           if (BaseIndexOf(element) > 0)
           {
               BaseRemove(element.Client);
           }
       }
 
       /// <summary>
       /// Removes at.
       /// </summary>
       ///<param name="index">The index.
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:33:29</remarks>
       public void RemoveAt(int index)
       {
           BaseRemoveAt(index);
       }
 
       /// <summary>
       /// Removes the specified client.
       /// </summary>
       ///<param name="client">The client.
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:04</remarks>
       public void Remove(string client)
       {
           BaseRemove(client);
       }
 
       /// <summary>
       /// Clears this instance.
       /// </summary>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:29</remarks>
       public void Clear()
       {
           BaseClear();
       }
   }</see>

最后是最外层的group:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/// <summary>
   /// Class MailServerSection 为入口:
   /// </summary>
   /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:41:02</remarks>
   public class MailServerSection : ConfigurationSection   //继承配置文件中节
   {
       /// <summary>
       /// Gets the provider.:映射mailServerGroup节点的provider
       /// </summary>
       /// <value>The provider.</value>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:59</remarks>
       [ConfigurationProperty("provider", IsKey = true)]
       public string provider { get { return this["provider"] as string; } }
 
       /// <summary>
       /// Gets or sets the mail servers.:映射新添加的节点mailServers节点;这个节点下还包含了若干个mailServer节点,因此它是一个集合类
       /// </summary>
       /// <value>The mail servers.</value>
       /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:56</remarks>
       [ConfigurationProperty("mailServers", IsDefaultCollection = false)]
       public MailServerCollection MailServers
       {
           get
           {
               return this["mailServers"] as MailServerCollection;
           }
           set
           {
               this["mailServers"] = value;
           }
 
       }
   }

同样,关联处理类和节点:

1
 

之后做个测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Program
    {
        static void Main(string[] args)
        {
            Test();
 
        }
 
        /// <summary>
        /// Tests this instance.:读取节点值示例
        /// </summary>
        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:04:53</remarks>
        private static void Test() {
 
            MailServerSection mailSection = (MailServerSection)ConfigurationManager.GetSection("mailServerGroup");
            Console.WriteLine("MailServerSection 的provider属性值:"+mailSection.provider);
            foreach (MailServerElement config in mailSection.MailServers)
            {
                Console.WriteLine("----------------------------------");
                Console.WriteLine("client值为:"+config.Client);
                Console.WriteLine("address值为:"+config.Address);
                Console.WriteLine("username值为:"+config.UserName);
                Console.WriteLine("password值为:"+config.Password);
                Console.WriteLine("----------------------------------");
            }
 
            Console.ReadKey();
 
        }
 
    }

http://www.2cto.com/kf/201506/412300.html

.Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点的更多相关文章

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

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

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

    除了使用继承IConfigurationSectionHandler的方法定义处理自己定义节点的类.还能够通过继承ConfigurationSection类实现相同效果. 首先说下.Net配置文件里一 ...

  3. [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较

    转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...

  4. 自定义 Mysql 类 与 自定义 异常类

    import MySQLdb class MyExcept(Exception): ''' 常见做法定义异常基类,然后在派生不同类型的异常 ''' def __init__(self, *args): ...

  5. tp5 ThinkPHP5 自定义异常处理类

    在项目的开发过程中异常抛出尤为重要不仅能够做出友好提示帮助掩盖我们伟大的程序员们尴尬的瞬间,还能做到提示开发人员代码白编写的错误,下面进行自定义异常抛出类,纯属个人理解,希望大家指正 首先在框架中我们 ...

  6. Spring自定义转换类,让@Value更方便

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 关于配置的文章已经写了很多,相信看过的人还是会有一定收获的,系列文章可阅读:南瓜慢说-配置相关文章.对于@Val ...

  7. 安卓开发28:自定义View类

    自定义View类 通过自定义View类,可以自定义复杂的,按照自己需求的控件. 一个简单的例子 mainActivity.java 这个里面就是最普通的代码,但是给自定义的控件加上了一个onclick ...

  8. [转]通过继承ConfigurationSection,在web.config中增加自定义配置

    本文转自:http://www.blue1000.com/bkhtml/2008-02/55810.htm 前几天写了一篇使用IConfigurationSectionHandler在web.conf ...

  9. 自定义继承于Page的基类

    自定义继承于Page的基类:MyBasePage[校验用户是否登录,如果登录则获取用户信息,否则跳转到登录页面]============================================ ...

随机推荐

  1. python 中偏函数 partial 的使用

    函数的partial应用 函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 例 ...

  2. 关于execel单元格中的数字变成文本(左上角带绿色三角形标志)的办法

    对于很多软件,需要将数字变成文本,才能导入到该系统当中.在excel当中,如果数字是以文本的形式存储,在左上角是带有绿色的三角形标志的.如果对于大批量数据,操作方法如下:1将目标列数据copy到记事本 ...

  3. img标签中的图片加载异常时显示默认的图片

    备忘:

  4. C++的黑科技

    周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,"如何产生一个不能被继承的类",这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一 ...

  5. Hadoop2.x源码-编译剖析

    1.概述 最近,有小伙伴涉及到源码编译.然而,在编译期间也是遇到各种坑,在求助于搜索引擎,技术博客,也是难以解决自身所遇到的问题.笔者在被询问多次的情况下,今天打算为大家来写一篇文章来剖析下编译的细节 ...

  6. 【openwrt】再设置

    https://wiki.openwrt.org/zh-cn/doc/uci/network https://wiki.openwrt.org/zh-cn/doc/uci/wireless https ...

  7. AngularJs解决方案笔记(1)

    接触AngularJs约1年半时间,目前用其独立完成了一个Solution, 构建出比较完整的项目架构,从C/S往B/S转型的过程背后是大量精力与时间成本的付出,特别是工作了好几年后, 本来掌握好的稳 ...

  8. LoadRunner11.52发布,全新的VTS

    LoadRunner11.52发布,全新的VTShttp://automationqa.com/forum.php?mod=viewthread&tid=2252&fromuid=2 ...

  9. IT战略规划咨询

    目录 1IT战略规划微咨询简介 2IT战略的意义 3服务模式 4IT战略规划焦点问题 5IT战略规划步骤 6服务提供方微咨询网 7微咨询价值 8微咨询服务方式 9IT工作规划与IT战略规... IT战 ...

  10. Freemyapps赚取积分终极图文教程

    Freemyapps怎么赚积分.Clash of Clans宝石获得技巧的终极教程来啦~此教程详细指导大家一步步的成功获取大量积分,买5个农民神马的自然不再话下.当然,人民币玩家可以略过~   原文作 ...