关注点:

  • 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#面向对象方式设置、读取应用配置的更多相关文章

  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. orm查询

    all:models.表名.objects.all() 结果是queryset集合 filter: models.表名.objects.filter() 结果是queryset集合 get: mode ...

  2. ----------- Rootkit 核心技术之绕过 IopParseDevice() 调用源检测逻辑 ---------------

    ---------------------------------------------------------------- 在上一篇文章中,我们已经看到 IopParseDevice() 如何对 ...

  3. Hadoop(十)Hadoop IO之数据完整性

    前言 上一篇我分享了Hadoop的压缩和编解码器,在我们开发的过程中其实是经常会用到的,所以一定要去掌握.这一篇给大家介绍的是Hadoop的数据完整性! Hadoop用户在使用HDFS储存和处理数据不 ...

  4. Java学习笔记【持续更新】

    一个简单的java程序如下: class Sakura { public static void main(String[] arges) { system.out.println("Hel ...

  5. [bzoj2288][POJ Challenge]生日礼物

    用堆维护双向链表来贪心... 数据范围显然不容许O(nm)的傻逼dp>_<..而且dp光是状态就n*m个了..显然没法优化 大概就会想到贪心乱搞了吧...一开始想贪心地通过几段小的负数把正 ...

  6. JFinal极速开发框架使用笔记(三) 分析Model和ActiveRecord

    JFinal框架的一些新发现的用法: 在JFinal框架中,实体类并不需要设置属性,更不需要配置getset方法就可以很方便的操作数据库,如果需要设置或者获取属性,可以直接使用一下方式: User u ...

  7. 初识maven及其安装步骤!!

    maven(01)--安装及其介绍   1:下载maven windows下载 2:将下载文件夹解压,然后放在一个安装目录(可任意选择),例如就放在D盘的根目录 然后在设置环境变量,新建一个环境变量, ...

  8. [国嵌笔记][007][Linux网络配置]

    Vmware网络设置 1.bridged(桥接模式) 如果网络中能提供多个IP地址,则使用桥接方式.虚拟机与主机的IP地址彼此独立. 2.NAT(网络地址转换模式) 如果只能提供一个IP地址,则使用N ...

  9. HDU 5914 Triangle(打表——斐波那契数的应用)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whos ...

  10. iOS微信自动抢红包插件(支持后台和锁屏下抢红包)

    前言:本文主要讲述使用hook方式实现红包插件,涉及到tweak相关知识,如果你不想了解具体实现细节可直接到我的Github地址参考安装(包含越狱和非越狱两种方法)   转眼间2017即将过去,又到了 ...