获取方法:

  /*使用方法:1. 在web.config 的<configSections> 节点中添加<section name="customConfigs" type="FortuneLab.Core.Configurations.CustomConfigsSection,FortuneLab.Core"/>2. 在web.config 中添加 如下配置<customConfigs><cfg name="dbCommands" fliePath="ConfigFiles\dbCommands.config"/><!--根据需要可以继续添加其他 cfg 配置,如<cfg name="dbConnections" fliePath="ConfigFiles\dbConnections.config"/><cfg name="params" fliePath="ConfigFiles\params.config"/>--></customConfigs>    3. cs中通过 ConfigManager.Configs["dbCommands"] 获取例如 dbCommands 的配置文件内容如下
<?xml version="1.0" encoding="utf-8"?>
<Container><A A1="" A2=""><A3><![CDATA[ xxxxxx ]]></A3><A4><Parameters><Param name="p1"></Param><Param name="p2"></Param><Param name="p3"></Param></Parameters></A4></A>
</Container>取A : ConfigManager.Configs["dbCommands"].A取A1: ConfigManager.Configs["dbCommands"].A.A1取A2: ConfigManager.Configs["dbCommands"].A.A2取A3: ConfigManager.Configs["dbCommands"].A.A3取A4: ConfigManager.Configs["dbCommands"].A.A4取Parameters: ConfigManager.Configs["dbCommands"].A.Parameters取Parameters 第一个: ConfigManager.Configs["dbCommands"].A.Parameters["p1"] 或者 ConfigManager.Configs["dbCommands"].A.Parameters[0]终极用法: 可以将任意一个节点转换为IDictionary<string, dynamic>, 然后再操作IDictionary<string, dynamic> dict = ConfigManager.Configs["dbCommands"].A as IDictionary<string, dynamic>;取A1: dict["A1"]取A2: dict["A2"]取A3: dict["A3"]取A4: dict["A4"]IDictionary<string, dynamic> dict1 = dict["A4"] as IDictionary<string, dynamic>;取Parameters: dict1["Parameters"]IDictionary<string, dynamic> dict2 = dict1["Parameters"] as IDictionary<string, dynamic>;取Parameters 第一个: dict2["p1"] 或 dict2[0]备注: 任何使用都可以使用HasMember("memberName"), 取检查是否有这个成员如果是集合, 可用使用foreach有Value属性,可以取到尖括号之间的内容,比如<A>hahah</A> , 可以用A.Value 取到其中的值,所以请避免显示定义Value属性*/public class ConfigManager{#region Create Configprivate static Dictionary<string, dynamic> CreateCustomConfig(){Dictionary<string, dynamic> allConfig = new Dictionary<string, dynamic>();CustomConfigsSection config = (CustomConfigsSection)ConfigurationManager.GetSection("customConfigs");for (int i = 0; i < config.CustomConfigs.Count; i++){var perConfig = config.CustomConfigs[i];allConfig.Add(perConfig.Name, CreateConfigDyObj(perConfig));}return allConfig;}private static dynamic CreateConfigDyObj(CustomConfigElement config){string path = HttpContext.Current.Server.MapPath("~/") + config.ConfigFliePath;XElement doc = XElement.Load(path);dynamic dyObj = CreateDyObj(doc);return dyObj;}private static dynamic CreateDyObj(XElement elem){dynamic dyObj = new ExpandoObject();var dict = (IDictionary<string, dynamic>)dyObj;#region Elements of elem/** 先检查是否有同名元素,*  如果有,则新建为XXX = new Dictionary<string,ExpandoObject>();*  如果没有,则新建为XXX = new ExpandoObject();* */if (elem.HasElements){var distinctNames = elem.Elements().Select(p => p.Name.ToString()).Distinct();if (distinctNames.Count() == elem.Elements().Count() && elem.Elements().Count() == 1) //只有一个子元素{var cfg_IsList = elem.Attribute("cfg_IsList");if (cfg_IsList != null && Convert.ToBoolean(cfg_IsList.Value)) //子元素按集合处理{WrapDictionary wrapDict = new WrapDictionary();wrapDict.Add(elem.Elements().First().Attribute("name").Value, CreateDyObj(elem.Elements().First()));dyObj = wrapDict;}else{dynamic oo = CreateDyObj(elem.Elements().First());dict.Add(elem.Elements().First().Name.ToString(), oo);}}else if (distinctNames.Count() == 1) //多个子元素,并且所有子元素都是 相同结构的{if (dict.Keys.Count <= 0){WrapDictionary wrapDict = new WrapDictionary();foreach (var perElem in elem.Elements()){wrapDict.Add(perElem.Attribute("name").Value, CreateDyObj(perElem));}dyObj = wrapDict;}}else if (distinctNames.Count() == elem.Elements().Count()) //多个子元素,所有子元素都是 不同结构的{foreach (var perElem in elem.Elements()){dynamic oo = CreateDyObj(perElem);dict.Add(perElem.Name.ToString(), oo);}}else{throw new Exception(string.Format("{0} subelement set error!", elem.Name.ToString()));}}#endregion#region Nodes of elemif (!elem.HasElements){if (elem.Nodes().Count() > 0){XNode node = elem.Nodes().FirstOrDefault(p => p.NodeType != System.Xml.XmlNodeType.Comment);if (node != null && (node.NodeType == System.Xml.XmlNodeType.CDATA || node.NodeType == System.Xml.XmlNodeType.Text)){dict.Add("Value", elem.Value);}else{dict.Add("Value", null);}}else{dict.Add("Value", null);}#region Attributes of elemif (elem.HasAttributes){foreach (var perAttr in elem.Attributes()){if (!dict.ContainsKey(perAttr.Name.ToString()))dict.Add(perAttr.Name.ToString(), perAttr.Value);}}#endregion}#endregiondict.Add("HasMember", new Func<string, bool>(memberName => dict.Keys.Contains(memberName)));return dyObj;}#endregionprivate static Dictionary<string, dynamic> _allConfig = null;public static Dictionary<string, dynamic> Configs{get{if (_allConfig == null){_allConfig = ConfigManager.CreateCustomConfig();}return new Dictionary<string, dynamic>(_allConfig);}}}public class WrapDictionary : IEnumerable{Dictionary<string, dynamic> dySet = new Dictionary<string, dynamic>();public void Add(string memberName, dynamic obj){dySet.Add(memberName, obj);}public bool HasMember(string memberName){return dySet.ContainsKey(memberName);}public dynamic this[string name]{get{return dySet[name];}}public IEnumerator GetEnumerator(){foreach (var item in dySet){yield return item.Value;}}}

 ABP CustomConfig

  

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Abp.Configurations
{public class CustomConfigsSection : ConfigurationSection{[ConfigurationProperty("", IsDefaultCollection = true)]public CustomConfigElementCollection CustomConfigs{get{return (CustomConfigElementCollection)this[""];}}}public class CustomConfigElementCollection : ConfigurationElementCollection{protected override ConfigurationElement CreateNewElement(){return new CustomConfigElement();}protected override object GetElementKey(ConfigurationElement element){return ((CustomConfigElement)element).Name;}public override ConfigurationElementCollectionType CollectionType{get{return ConfigurationElementCollectionType.BasicMap;}}protected override string ElementName{get{return "cfg";}}public CustomConfigElement this[int index]{get{return (CustomConfigElement)BaseGet(index);}}}public class CustomConfigElement : ConfigurationElement{[ConfigurationProperty("name", IsRequired = true)]public string Name{get { return (string)this["name"]; }set { this["name"] = value; }}[ConfigurationProperty("fliePath", IsRequired = true)]public string ConfigFliePath{get { return (string)this["fliePath"]; }set { this["fliePath"] = value; }}}
}

WebConfig配置:

  

 <configSections><section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /><section name="customConfigs" type="Abp.Configurations.CustomConfigsSection,FortuneLab.Abp" /><!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --><!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections><entityFramework><defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /><providers><provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /></providers></entityFramework><customConfigs><cfg name="FordParames" fliePath="ConfigFiles\Ford\Parames.config" /><cfg name="LandRoverDBCommands" fliePath="ConfigFiles\LandRover\dbCommands.config" /><cfg name="PaymentDBCommands" fliePath="ConfigFiles\LandRover\PaymentDBCommands.config" /><cfg name="LockCarDBCommands" fliePath="ConfigFiles\LandRover\LockCarDBCommands.config" /><cfg name="InvoiceDBCommands" fliePath="ConfigFiles\LandRover\InvoiceDBCommands.config" /><cfg name="LRVerifyConfigs" fliePath="ConfigFiles\LandRover\VerifyConfigs.config" /><cfg name="FordDBCommands" fliePath="ConfigFiles\Ford\dbCommands.config" /><cfg name="ResourceParames" fliePath="ConfigFiles\Ford\Parames.config" /></customConfigs>

 使用方法:

  

 private static string ResourcePath = ConfigManager.Configs["ResourceParames"].ResourcePath.Value;

  

  

 

转载于:https://www.cnblogs.com/Wolfmanlq/p/4847283.html

C#动态属性(.NET Framework4.5支持)相关推荐

  1. 小菜学习设计模式(五)—控制反转(Ioc)

    写在前面 设计模式目录: 小菜学习设计模式(一)-模板方法(Template)模式 小菜学习设计模式(二)-单例(Singleton)模式 小菜学习设计模式(三)-工厂方法(Factory Metho ...

  2. .net core实践系列之短信服务-Api的SDK的实现与测试

    前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...

  3. 新型自动站业务用计算机采用,新型自动站出现的故障及解决方法

    周晓倩 摘要 新型自动站自2014年1月1日在莘县运行以来,以其高效.稳定.准确而赢得社会各界的认可,特别是CAN总线技术的应用,实现了主采集器和分采集器之间的连接,使自动气象站可以轻松地进行功能扩充 ...

  4. QML(1): 什么是QML

    文章目录 前言 一.QML 是什么? 二.Qt Quick 又是什么? 三.简单代码示例 四.察看QML视图效果 总结 前言   QML 早已经不限于开发手机应用,也可以支持用户开发传统的桌面程序.Q ...

  5. Andorid Tools--强大的Apk反编译,Rom提取工具,从此告别枯燥的命令

    Andorid Tools--强大的Apk反编译,Rom提取工具,从此告别枯燥的命令 零.说明 1.本软件为兴趣而写,如有侵权,请告知. 2.本软件为本人所编写,未经允许,不得转载. 一.软件界面(当 ...

  6. xXx时间屏保 3.6.1

    更新记录 xXx时间屏保更新记录 软件简介 龙家二少编写的Windows屏保软件 一款会随着时间变化密码的纯绿色安全锁屏软件 酷炫的3D效果界面 话不多说,请看介绍: 如果您要离开电脑而又不想别人使用 ...

  7. xXx图片助手 V2.0 ---新一代的装B神器

    本软件为龙家二少原创!欢迎转载... 特征 批量压缩图片 批量处理图片尺寸 绿色.免费 支持jpg.png格式 支持拖放添加图片 支持改变 dpi 支持以厘米为单位 支持并行操作 支持批量处理 支持自 ...

  8. Jitsi(SIP communicator)的环境部署和打包发布

    简介 Jitsi是一个开源的,安全(ZRTP加密),高质量的SIP/XMPP视频通话.会议.聊天.桌面共享.文件传传输.可以安装在你喜欢的操作系统中并且支持多种IM网络.Jitsi是当最功能最完整的高 ...

  9. KRBTabControl(中文)Windows选项卡控件

    本文阐述了如何在C#使自定义Windows选项卡控件. Download demo project - 82.4 KB Download source - 252 KB 介绍 本文讨论如何使用.NET ...

最新文章

  1. [转载]TFS与Project、Excel同步
  2. mysql视图登录_mysql视图
  3. LeetCode Edit Distance(动态规划)
  4. 剑指offer(Java实现) 平衡二叉树
  5. 4k视频写入速度要求_为什么视频工作者需要外置硬盘?
  6. ESD二极管 DW12P4N3-S 电压12V 封装DFN2020-3L
  7. 【渝粤题库】广东开放大学 秘书理论与实务 形成性考核
  8. PL/SQL 编程(二)
  9. python字符串是什么_python字符串详解
  10. 玩转运维编排服务的权限:Assume Role+Pass Role
  11. ios html特殊符号转化,iOS HTML特殊字符转译
  12. OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析
  13. mescroll.js API汇总
  14. 网络技术人员要知道的100个安全工具
  15. 虚拟机安装CentOs系统
  16. 如何合理运用美容院资源
  17. 用无参的方式new对象
  18. 基于springboot手工diy网站 毕业设计-附源码 310226
  19. 服务器机房单线和双线机房该如何选择?
  20. 数学建模复习(7.多元线性回归模型实例)

热门文章

  1. 重新想象 Windows 8.1 Store Apps (79) - 控件增强: MediaElement, Frame
  2. Jupidator 0.8.0 发布,Java 应用自动更新框架
  3. 面试题:接口和抽象类的区别
  4. 给普通用户赋予docker权限
  5. leetcode算法题--分隔链表★
  6. axios vue 回调函数_Vue 02 —— Vue 入门小案例~使用 Axios 中的GET、POST请求
  7. CListCtrl列表控件---总结
  8. java spring maven pdf 导出
  9. 【Java系列】从JVM角度解析Java核心类String的不可变特性
  10. Nginx服务测试时的一些配置:wireshark、常用搜索URL格式、关闭防火墙、siege