0

0

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

黄舟

黄舟

发布时间:2017-02-24 10:29:52

|

4537人浏览过

|

来源于php中文网

原创

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

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

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

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


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

      


    
      
      
      
      
    
  

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

首先是最内层的mailServer:    

 /// 
    /// Class MailServerElement:用于映射mailServer节点,这里是实际存储数据的地方;
    /// 
    /// Editor:v-liuhch CreateTime:2015/6/27 21:51:57
    public sealed class MailServerElement : ConfigurationElement  //配置文件中的配置元素
    {

        /// 
        /// Gets or sets the client.
        /// 
        /// The client.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:40
        [ConfigurationProperty("client", IsKey = true, IsRequired = true)]  //client是必须的key属性,有点儿主键的意思,例如,如果定义多个client相同的节点,循环读取的话就只读取到最后一个值
        public string Client
        {
            get
            {
                return this["client"] as string;
            }
            set
            {
                this["client"] = value;
            }

        }
        /// 
        /// Gets or sets the address.
        /// 
        /// The address.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:38
        [ConfigurationProperty("address")]
        public string Address
        {
            get
            {
                return this["address"] as string;
            }
            set
            {
                this["address"] = value;
            }

        }
        /// 
        /// Gets or sets the name of the user.
        /// 
        /// The name of the user.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:35
        [ConfigurationProperty("userName")]
        public string UserName
        {

            get
            {
                return this["userName"] as string;
            }
            set
            {
                this["userName"] = value;
            }

        }
        /// 
        /// Gets or sets the password.
        /// 
        /// The password.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:33
        [ConfigurationProperty("password")]
        public string Password
        {

            get
            {
                return this["password"] as string;
            }
            set
            {
                this["password"] = value;
            }

        }



    }

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

 /// 
    /// Class MailServerCollection:映射mailServers节点,为一个集合类,另外还包含了很多对节点的操作方法,大部分继承自ConfigurationElementCollection
    /// 
    /// Editor:v-liuhch CreateTime:2015/6/27 21:52:00
    public sealed class MailServerCollection : ConfigurationElementCollection
    {
        /// 
        /// 获取  的类型。
        /// 
        /// The type of the collection.
        /// 此集合的 
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:08
        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.BasicMap;
            }
         
        }


        /// 
        /// 当在派生的类中重写时,创建一个新的 。
        /// 
        /// 新的 
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:03
        protected override ConfigurationElement CreateNewElement()
        {
            return new MailServerElement();
        }

        /// 
        /// 在派生类中重写时获取指定配置元素的元素键。
        /// 
        /// 要为其返回键的 。
        /// 一个 ,用作指定  的键。
        /// Editor:v-liuhch CreateTime:2015/6/27 22:04:51
        protected override object GetElementKey(ConfigurationElement element)
        {
            return (element as MailServerElement).Client;
        }

        /// 
        /// 获取在派生的类中重写时用于标识配置文件中此元素集合的名称。
        /// 
        /// The name of the element.
        /// 集合的名称;否则为空字符串。默认值为空字符串。
        /// Editor:v-liuhch CreateTime:2015/6/27 23:41:40
        protected override string ElementName
        {
            get
            {
                return "mailServer";
            }
        }


        /// 
        /// 获取集合中的元素数。
        /// 
        /// The count.
        /// 集合中的元素数。
        /// Editor:v-liuhch CreateTime:2015/6/27 22:08:24
        public new int Count
        {
            get { return base.Count; }
        }

        /// 
        /// 获取或设置此配置元素的属性、特性或子元素。
        /// 
        /// The index.
        /// MailServerElement.
        /// Editor:v-liuhch
        public MailServerElement this[int index]
        {

            get { return BaseGet(index) as MailServerElement; }
            set
            {
                if (BaseGet(index) != null)
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }

        }

        /// 
        /// 获取或设置此配置元素的属性、特性或子元素。
        /// 
        /// The name.
        /// MailServerElement.
        /// Editor:v-liuhch
        new public MailServerElement this[string Name]
        {
            get { return BaseGet(Name) as MailServerElement; }
        }

        /// 
        /// Indexes the of.
        /// 
        /// The element.
        /// System.Int32.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:24:16
        public int IndexOf(MailServerElement element)
        {

            return BaseIndexOf(element);
        }

        /// 
        /// Adds the specified element.
        /// 
        /// The element.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:26:06
        public void Add(MailServerElement element)
        {
            BaseAdd(element);
        }

        /// 
        /// Removes the specified element.
        /// 
        /// The element.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:27:01
        public void Remove(MailServerElement element)
        {
            if (BaseIndexOf(element) > 0)
            {
                BaseRemove(element.Client);
            }
        }

        /// 
        /// Removes at.
        /// 
        /// The index.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:33:29
        public void RemoveAt(int index)
        {
            BaseRemoveAt(index);
        }

        /// 
        /// Removes the specified client.
        /// 
        /// The client.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:34:04
        public void Remove(string client)
        {
            BaseRemove(client);
        }

        /// 
        /// Clears this instance.
        /// 
        /// Editor:v-liuhch CreateTime:2015/6/27 22:34:29
        public void Clear()
        {
            BaseClear();
        }
    }

最后是最外层的group:

元典智库
元典智库

元典智库:智能开放的法律搜索引擎

下载

 /// 
    /// Class MailServerSection 为入口:
    /// 
    /// Editor:v-liuhch CreateTime:2015/6/27 21:41:02
    public class MailServerSection : ConfigurationSection   //继承配置文件中节
    {
        /// 
        /// Gets the provider.:映射mailServerGroup节点的provider
        /// 
        /// The provider.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:59
        [ConfigurationProperty("provider", IsKey = true)]
        public string provider { get { return this["provider"] as string; } }

        /// 
        /// Gets or sets the mail servers.:映射新添加的节点mailServers节点;这个节点下还包含了若干个mailServer节点,因此它是一个集合类
        /// 
        /// The mail servers.
        /// Editor:v-liuhch CreateTime:2015/6/27 22:05:56
        [ConfigurationProperty("mailServers", IsDefaultCollection = false)]
        public MailServerCollection MailServers
        {
            get
            {
                return this["mailServers"] as MailServerCollection;
            }
            set
            {
                this["mailServers"] = value;
            }

        }
    }

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

 

之后做个测试:

class Program
    {
        static void Main(string[] args)
        {
            Test();

        }

        /// 
        /// Tests this instance.:读取节点值示例
        /// 
        /// Editor:v-liuhch CreateTime:2015/6/27 23:04:53
        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();

        }

    }

 本来还想传张结果图,但是网速慢,算啦,喜欢玩儿的童鞋自己run下结果。。。。。

 以上就是.Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点 的内容,更多相关内容请关注PHP中文网(www.php.cn)!





热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

53

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

40

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

50

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

11

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

13

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.1万人学习

python编程入门系列图文教程
python编程入门系列图文教程

共65课时 | 24.7万人学习

vscode其实很简单
vscode其实很简单

共72课时 | 29.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号