博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点
阅读量:5307 次
发布时间:2019-06-14

本文共 9527 字,大约阅读时间需要 31 分钟。

除了使用继承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=
""
password=
"2343254"
username=
"lhc"
>
      
<mailserver address=
"132wdfgdsggtaewg32@qq.com"
client=
""
password=
"2334t243的萨芬234254"
username=
"dfshs水田如雅"
>
      
<mailserver address=
"132wdgadsfgdtaewg32@qq.com"
client=
""
password=
"23ewrty2343的萨芬234254"
username=
"sdfhdfs水田如雅"
>
      
<mailserver address=
"132wdgdfagdstaewg32@qq.com"
client=
""
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

转载于:https://www.cnblogs.com/amylis_chen/p/5984884.html

你可能感兴趣的文章
多线程(四):前台和后台线程
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
9款免费的Windows远程协助软件
查看>>
Maven(八) Maven项目和testng结合应用
查看>>
iOS 的 set.get.构造方法
查看>>
无法根据中文查找
查看>>
转载 10 Python Machine Learning Projects on GitHub
查看>>
第三周作业
查看>>
软件工程第二次作业
查看>>
结束端口占用
查看>>
【微信公众平台】 之 消息自动回复
查看>>
ContentType
查看>>
[POJ2625][UVA10288]Coupons
查看>>
随机数
查看>>
pta 编程题21 公路村村通
查看>>
怎么用Visio画用例图
查看>>
嵌入式应用开发第四阶段-基于rk3399的视频监控系统
查看>>
ASP.NET 事件日历(Event Calendar)
查看>>