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

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

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

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

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

<mailServerGroup provider="www.baidu.com">
<mailServers>
<mailServer client="http://blog.csdn.net/lhc1105" address="13232@qq.com" userName="lhc" password="2343254"/>
<mailServer client="http://blog345.csdn.net/lhc1105" address="132wdfgdsggtaewg32@qq.com" userName="dfshs水田如雅" password="2334t243的萨芬234254"/>
<mailServer client="http://blog436.csdn.net/lhc1105" address="132wdgadsfgdtaewg32@qq.com" userName="sdfhdfs水田如雅" password="23ewrty2343的萨芬234254"/>
<mailServer client="http://blo345734g.csdn.net/lhc1105" address="132wdgdfagdstaewg32@qq.com" userName="sdfher水田如雅" password="23erwt43的萨芬234254"/>
</mailServers>
</mailServerGroup>

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

首先是最内层的mailServer:

 

 /// <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的集合:

 /// <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" /> 的类型。
/// </summary>
/// <value>The type of the collection.</value>
/// <returns>此集合的 <see cref="T:System.Configuration.ConfigurationElementCollectionType" />。</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" />。
/// </summary>
/// <returns>新的 <see cref="T:System.Configuration.ConfigurationElement" />。</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" />。</param>
/// <returns>一个 <see cref="T:System.Object" />,用作指定 <see cref="T:System.Configuration.ConfigurationElement" /> 的键。</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.</param>
/// <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.</param>
/// <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.</param>
/// <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.</param>
/// <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.</param>
/// <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.</param>
/// <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.</param>
/// <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();
}
}

最后是最外层的group:

 /// <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;
} }
}

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

 <section name="mailServerGroup" type="继承ConfigurationSection基类.MailServerSection,继承ConfigurationSection基类"/>
</configSections>

之后做个测试:

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(); } }

.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. 袭击Mercurial SCM(HG)

    这个叫水银的源代码管理工具尽管默默无闻,但还是得到了非常多团队的使用. 为了迎合某些团队的须要,我们也要用它来管理我们的代码. 今天的任务是先袭击学习.磨刀不误砍柴工. 对工具的掌握越快.工作的效率就 ...

  2. Ecshop商品详情页显示当前会员等级价格

    会员登录状态下,在ECSHOP商品详情页的本店售价中显示当前登录会员对应的等级价格,在未登录状态下,则还默认显示原来的本店售价. 解决方法: 这个需要修改ECSHOP程序代码来实现. 打开文件 /in ...

  3. 无法import的原因(ImportError: No module named *****)

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...

  4. 阿里云 Redis 服务遇到的问题

    ERR unknown command eval 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: St ...

  5. 让MyEclipse2013兼容Retina屏幕

    1. 找到文件:/Applications/MyEclipse/MyEclipse Professional.app/Contents/Profile/myeclipse.app/Contents/I ...

  6. Net框架下-ORM框架LLBLGen的简介

    >对于应用程序行业领域来说,涉及到Net框架的,在众多支持大型项目的商用ORM框架中,使用最多的目前了解的主要有三款: 1.NHibernate(从Java版移植来的Net版). 2.微软的EF ...

  7. [转]LINQ To SQL 语法及实例大全

    转载自:http://blog.csdn.net/pan_junbiao/article/details/7015633 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过 ...

  8. RPM 包下载 GCC 4.8安装

    http://ftp.scientificlinux.org/linux/scientific/ http://www.rpmfind.net/linux/rpm2html/search.php?qu ...

  9. windows 程序设计自学:添加字符串资源

    #include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...

  10. 命令行 更新Android sdk

    使用如下代理服务器: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: http://ubuntu.b ...