关注点

  • 1、用面向对象方式的方式(get,set)访问和设置配置项
  • 2、“CallerMemberName”在.net 4以下的变通方式

最后一周了,大伙都进入过年模式了。身还在,心已远。最近事情不是很多,老是看闪存也是不对啊。于是想起来前几天看到的一篇文章:“在 .NET中,一种更方便操作配置项的方法”;于是跃跃欲试,尝试一下。结果遇到点问题,文章中使用了CallerMemberName属性来简化存取配置项时需要硬编码带上配置项的Key的问题,这个属性的用途就是标记在运行时自动获取属性名,但是这是.net 4.5以上才有的。由于我们做工控需要兼容工控机的老操作系统,.net一直是4.0。于是遇到兼容问题了。百度出来,发现杨中科老师的办法是使用StackTrace具体就是:“new StackTrace(true).GetFrame(1).GetMethod().Name”。于是对文章中的类进行了修改:

  1. public abstract class ConfigSetting : INotifyPropertyChanged
  2. {
  3. private void NotifyPropertyChanged(string property)
  4. {
  5. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
  6. }
  7. /// <summary>
  8. /// 配置类
  9. /// </summary>
  10. /// <param name="configuration">配置</param>
  11. public ConfigSetting(Configuration configuration)
  12. {
  13. Configuration = configuration;
  14. }
  15.  
  16. /// <summary>
  17. /// 当前配置
  18. /// </summary>
  19. public Configuration Configuration
  20. {
  21. get;
  22. }
  23.  
  24. public event PropertyChangedEventHandler PropertyChanged;
  25.  
  26. /// <summary>
  27. /// 获取当前程序配置
  28. /// </summary>
  29. /// <param name="config"></param>
  30. /// <returns></returns>
  31. public static Configuration GetCurrentConfiguration()
  32. {
  33. return ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
  34. }
  35.  
  36. /// <summary>
  37. /// 返回指定的配置项的值
  38. /// </summary>
  39. /// <param name="settingKey"></param>
  40. /// <returns></returns>
  41. protected virtual string GetSettingValue(string settingKey = null)
  42. {
  43. if (string.IsNullOrEmpty(settingKey))
  44. settingKey = new StackTrace(true).GetFrame(1).GetMethod().Name.Replace("get_", "");
  45. return Configuration?.AppSettings?.Settings[settingKey]?.Value;
  46. }
  47.  
  48. /// <summary>
  49. /// 返回指定的配置项的值
  50. /// </summary>
  51. /// <typeparam name="T">值类型</typeparam>
  52. /// <param name="settingKey"></param>
  53. /// <returns></returns>
  54. protected virtual T GetSettingValue<T>(string settingKey = null)
  55. {
  56. if (string.IsNullOrEmpty(settingKey))
  57. settingKey = new StackTrace(true).GetFrame(1).GetMethod().Name.Replace("get_", "");
  58. var value = GetSettingValue(settingKey);
  59. if (string.IsNullOrWhiteSpace(value))
  60. {
  61. return default(T);
  62. }
  63. else
  64. {
  65. return (T)Convert.ChangeType(value, typeof(T));
  66. }
  67. }
  68.  
  69. /// <summary>
  70. /// 为指定的配置项设置值
  71. /// </summary>
  72. /// <param name="value"></param>
  73. /// <param name="settingKey"></param>
  74. protected virtual void SetSettingValue(object value, string settingKey = null)
  75. {
  76. if (string.IsNullOrEmpty(settingKey))
  77. settingKey = new StackTrace(true).GetFrame(1).GetMethod().Name.Replace("set_", "");
  78. Configuration.AddOrUpdateAppSettingItem(settingKey, value?.ToString());
  79. NotifyPropertyChanged(settingKey);
  80. Configuration.Save();
  81. }
  82.  
  83. /// <summary>
  84. /// 返回指定的配置项的值
  85. /// </summary>
  86. /// <param name="settingKey"></param>
  87. /// <returns></returns>
  88. public string GetSettingValueByKey(string settingKey)
  89. {
  90. return GetSettingValue(settingKey);
  91. }
  92.  
  93. /// <summary>
  94. /// 返回指定的配置项的值
  95. /// </summary>
  96. /// <param name="settingKey"></param>
  97. /// <returns></returns>
  98. public T GetSettingValueByKey<T>(string settingKey)
  99. {
  100. return GetSettingValue<T>(settingKey);
  101. }
  102.  
  103. /// <summary>
  104. /// 为指定的配置项设置值
  105. /// </summary>
  106. /// <param name="value"></param>
  107. /// <param name="settingKey"></param>
  108. public void SetSettingValueByKey(string settingKey, object value)
  109. {
  110. SetSettingValue(value, settingKey);
  111. NotifyPropertyChanged(settingKey);
  112. }
  113. }

  实现INotifyPropertyChanged接口是为了让界面绑定配置项时,配置项的值发生变化时界面刷新显示。

单看这篇文章是看不明白的,需要大伙移步原文看看。

C#面向对象方式设置、读取应用配置的更多相关文章

  1. springboot 读取 yml 配置的几种方式

    前言:在springboot 项目中一般默认的配置文件是application.properties,但是实际项目中我们一般会使用application.yml 文件,下面就介绍一下在springbo ...

  2. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  3. Ubuntu Linux下设置IP的配置命令

    Ubuntu Linux下设置IP的配置命令 今天装了Ubuntu,但是发现不能上网,开始排查问题: 1.首先确定网络连接是否正确,所用的网线是否可以正常工作 2.查看网卡是否能正常工作,检测的方法如 ...

  4. 微软企业库5.0 学习之路——第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息

    在介绍完企业库几个常用模块后,我今天要对企业库的配置文件进行处理,缘由是我打开web.config想进行一些配置的时候发现web.config已经变的异常的臃肿(大量的企业库配置信息充斥其中),所以决 ...

  5. C#基础第八天-作业答案-设计类-面向对象方式实现两个帐户之间转账

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. C#基础第八天-作业-设计类-面向对象方式实现两个帐户之间转账

    要求1:完成以下两种账户类型的编码.银行的客户分为两大类:储蓄账户(SavingAccount)和信用账户(CreditAccount),两种的账户类型的区别在于:储蓄账户不允许透支,而信用账户可以透 ...

  7. Azkaban2.5安装部署(系统时区设置 + 安装和配置mysql + Azkaban Web Server 安装 + Azkaban Executor Server安装 + Azkaban web server插件安装 + Azkaban Executor Server 插件安装)(博主推荐)(五)

    Azkaban是什么?(一) Azkaban的功能特点(二) Azkaban的架构(三) Hadoop工作流引擎之Azkaban与Oozie对比(四) 不多说,直接上干货! http://www.cn ...

  8. @Autowired注解和启动自动扫描的三种方式(spring bean配置自动扫描功能的三种方式)

    前言: @Autowired注解代码定义 @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, Elemen ...

  9. vmware9虚拟机通过NAT上网方式设置

    vmware虚机上网的网络连接方式有bridge.NAT.Host-only等,如果对这个不了解的可以学习这篇文章http://wangchunhai.blog.51cto.com/225186/38 ...

随机推荐

  1. Swagger文档转Word 文档

    GitHub 地址:https://github.com/JMCuixy/SwaggerToWord/tree/developer 原创作品,转载请注明出处:http://www.cnblogs.co ...

  2. iOS学习——iOS项目Project 和 Targets配置详解

    最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理.我们iOS项目的开发 ...

  3. [bzoj1700]: [Usaco2007 Jan]Problem Solving 解题

    不能贪心!不能贪心!不能贪心! 反正有反例(有的题目月初支付款很少,月末支付款很大,和前面的题凑到一个月的话可能导致下个月写不了= =这时放后一个月,和后面的题一起开始写可能更优) 比如: 50 44 ...

  4. linux基本命令学习02

    =============================================================================a.txtc:\abc\a.txt windo ...

  5. BLE空中升级 谈(一)

    BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项 现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里不谈论它是满足 ...

  6. UE4 内容示例网络同步Learn

    一, 1.1 Actor的复制 Actor中的Replicates ,为true时,服务器会把该Actor同步,显示在客户端中. 1.2 Switch Has Authority判断是客户端还是服务器 ...

  7. git常用命令--转载

    http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

  8. JSP基础:JSP指令、JSP注释、JSP脚本、JSP声明、JSP表达式

    JSP指令分为:page指令.include指令.taglib指令. page指令:通常位于JSP页面的顶端,同一个页面可以有多个页面指令. 语法:<%@ page language=" ...

  9. jsp页面固定页面为绝对路径

    1 <!-- 固定到绝对路径 --> 2 <base href="<%=request.getContextPath()%>/"/>

  10. GBK,UTF8是什么?有什么区别,做网站选择哪种好?

    GBK包含全部中文字符: UTF-8则包含全世界所有国家需要用到的字符. GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准) UTF-8编码的文字可以在各国各种支持 ...