C#面向对象方式设置、读取应用配置
关注点:
- 1、用面向对象方式的方式(get,set)访问和设置配置项
- 2、“CallerMemberName”在.net 4以下的变通方式
最后一周了,大伙都进入过年模式了。身还在,心已远。最近事情不是很多,老是看闪存也是不对啊。于是想起来前几天看到的一篇文章:“在 .NET中,一种更方便操作配置项的方法”;于是跃跃欲试,尝试一下。结果遇到点问题,文章中使用了CallerMemberName属性来简化存取配置项时需要硬编码带上配置项的Key的问题,这个属性的用途就是标记在运行时自动获取属性名,但是这是.net 4.5以上才有的。由于我们做工控需要兼容工控机的老操作系统,.net一直是4.0。于是遇到兼容问题了。百度出来,发现杨中科老师的办法是使用StackTrace具体就是:“new StackTrace(true).GetFrame(1).GetMethod().Name”。于是对文章中的类进行了修改:
- public abstract class ConfigSetting : INotifyPropertyChanged
- {
- private void NotifyPropertyChanged(string property)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
- }
- /// <summary>
- /// 配置类
- /// </summary>
- /// <param name="configuration">配置</param>
- public ConfigSetting(Configuration configuration)
- {
- Configuration = configuration;
- }
- /// <summary>
- /// 当前配置
- /// </summary>
- public Configuration Configuration
- {
- get;
- }
- public event PropertyChangedEventHandler PropertyChanged;
- /// <summary>
- /// 获取当前程序配置
- /// </summary>
- /// <param name="config"></param>
- /// <returns></returns>
- public static Configuration GetCurrentConfiguration()
- {
- return ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- }
- /// <summary>
- /// 返回指定的配置项的值
- /// </summary>
- /// <param name="settingKey"></param>
- /// <returns></returns>
- protected virtual string GetSettingValue(string settingKey = null)
- {
- if (string.IsNullOrEmpty(settingKey))
- settingKey = new StackTrace(true).GetFrame(1).GetMethod().Name.Replace("get_", "");
- return Configuration?.AppSettings?.Settings[settingKey]?.Value;
- }
- /// <summary>
- /// 返回指定的配置项的值
- /// </summary>
- /// <typeparam name="T">值类型</typeparam>
- /// <param name="settingKey"></param>
- /// <returns></returns>
- protected virtual T GetSettingValue<T>(string settingKey = null)
- {
- if (string.IsNullOrEmpty(settingKey))
- settingKey = new StackTrace(true).GetFrame(1).GetMethod().Name.Replace("get_", "");
- var value = GetSettingValue(settingKey);
- if (string.IsNullOrWhiteSpace(value))
- {
- return default(T);
- }
- else
- {
- return (T)Convert.ChangeType(value, typeof(T));
- }
- }
- /// <summary>
- /// 为指定的配置项设置值
- /// </summary>
- /// <param name="value"></param>
- /// <param name="settingKey"></param>
- protected virtual void SetSettingValue(object value, string settingKey = null)
- {
- if (string.IsNullOrEmpty(settingKey))
- settingKey = new StackTrace(true).GetFrame(1).GetMethod().Name.Replace("set_", "");
- Configuration.AddOrUpdateAppSettingItem(settingKey, value?.ToString());
- NotifyPropertyChanged(settingKey);
- Configuration.Save();
- }
- /// <summary>
- /// 返回指定的配置项的值
- /// </summary>
- /// <param name="settingKey"></param>
- /// <returns></returns>
- public string GetSettingValueByKey(string settingKey)
- {
- return GetSettingValue(settingKey);
- }
- /// <summary>
- /// 返回指定的配置项的值
- /// </summary>
- /// <param name="settingKey"></param>
- /// <returns></returns>
- public T GetSettingValueByKey<T>(string settingKey)
- {
- return GetSettingValue<T>(settingKey);
- }
- /// <summary>
- /// 为指定的配置项设置值
- /// </summary>
- /// <param name="value"></param>
- /// <param name="settingKey"></param>
- public void SetSettingValueByKey(string settingKey, object value)
- {
- SetSettingValue(value, settingKey);
- NotifyPropertyChanged(settingKey);
- }
- }
实现INotifyPropertyChanged接口是为了让界面绑定配置项时,配置项的值发生变化时界面刷新显示。
单看这篇文章是看不明白的,需要大伙移步原文看看。
C#面向对象方式设置、读取应用配置的更多相关文章
- springboot 读取 yml 配置的几种方式
前言:在springboot 项目中一般默认的配置文件是application.properties,但是实际项目中我们一般会使用application.yml 文件,下面就介绍一下在springbo ...
- 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式
表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...
- Ubuntu Linux下设置IP的配置命令
Ubuntu Linux下设置IP的配置命令 今天装了Ubuntu,但是发现不能上网,开始排查问题: 1.首先确定网络连接是否正确,所用的网线是否可以正常工作 2.查看网卡是否能正常工作,检测的方法如 ...
- 微软企业库5.0 学习之路——第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息
在介绍完企业库几个常用模块后,我今天要对企业库的配置文件进行处理,缘由是我打开web.config想进行一些配置的时候发现web.config已经变的异常的臃肿(大量的企业库配置信息充斥其中),所以决 ...
- C#基础第八天-作业答案-设计类-面向对象方式实现两个帐户之间转账
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#基础第八天-作业-设计类-面向对象方式实现两个帐户之间转账
要求1:完成以下两种账户类型的编码.银行的客户分为两大类:储蓄账户(SavingAccount)和信用账户(CreditAccount),两种的账户类型的区别在于:储蓄账户不允许透支,而信用账户可以透 ...
- Azkaban2.5安装部署(系统时区设置 + 安装和配置mysql + Azkaban Web Server 安装 + Azkaban Executor Server安装 + Azkaban web server插件安装 + Azkaban Executor Server 插件安装)(博主推荐)(五)
Azkaban是什么?(一) Azkaban的功能特点(二) Azkaban的架构(三) Hadoop工作流引擎之Azkaban与Oozie对比(四) 不多说,直接上干货! http://www.cn ...
- @Autowired注解和启动自动扫描的三种方式(spring bean配置自动扫描功能的三种方式)
前言: @Autowired注解代码定义 @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, Elemen ...
- vmware9虚拟机通过NAT上网方式设置
vmware虚机上网的网络连接方式有bridge.NAT.Host-only等,如果对这个不了解的可以学习这篇文章http://wangchunhai.blog.51cto.com/225186/38 ...
随机推荐
- Swagger文档转Word 文档
GitHub 地址:https://github.com/JMCuixy/SwaggerToWord/tree/developer 原创作品,转载请注明出处:http://www.cnblogs.co ...
- iOS学习——iOS项目Project 和 Targets配置详解
最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理.我们iOS项目的开发 ...
- [bzoj1700]: [Usaco2007 Jan]Problem Solving 解题
不能贪心!不能贪心!不能贪心! 反正有反例(有的题目月初支付款很少,月末支付款很大,和前面的题凑到一个月的话可能导致下个月写不了= =这时放后一个月,和后面的题一起开始写可能更优) 比如: 50 44 ...
- linux基本命令学习02
=============================================================================a.txtc:\abc\a.txt windo ...
- BLE空中升级 谈(一)
BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项 现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里不谈论它是满足 ...
- UE4 内容示例网络同步Learn
一, 1.1 Actor的复制 Actor中的Replicates ,为true时,服务器会把该Actor同步,显示在客户端中. 1.2 Switch Has Authority判断是客户端还是服务器 ...
- git常用命令--转载
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
- JSP基础:JSP指令、JSP注释、JSP脚本、JSP声明、JSP表达式
JSP指令分为:page指令.include指令.taglib指令. page指令:通常位于JSP页面的顶端,同一个页面可以有多个页面指令. 语法:<%@ page language=" ...
- jsp页面固定页面为绝对路径
1 <!-- 固定到绝对路径 --> 2 <base href="<%=request.getContextPath()%>/"/>
- GBK,UTF8是什么?有什么区别,做网站选择哪种好?
GBK包含全部中文字符: UTF-8则包含全世界所有国家需要用到的字符. GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准) UTF-8编码的文字可以在各国各种支持 ...