使用StackStrace获取属性名称的惨痛教训

作者:V君 发布于:2017-7-21 18:04 Friday 分类:折腾手记

TL;DR: 改用 CallerMemberName 的方式.


必须扯,内容再少也要扯!

 

一直以来, 封装配置访问类时, 根据同样的只读属性名称去字典值或查数据库.

尽管比较新的 nameof 关键字可用, 但还是需要重复打字, 这非常不爽.


于是自作聪明的咱就抓取上一个堆栈帧, 取出方法名的方式代替Key.

定义一个无参方法 GetValue ,里面去抓 StackTrace, 

一般情况下, 只读属性的方法名是 get_XXXX, 这种情况直接去掉头就可以吃了.

然后只读属性的 getter 就直接无参调用 GetValue(),

看到一大堆只读属性调用同一个无参方法是不是很魔法啊? 乂目

  public string ConfA => GetValue();
  public string ConfB => GetValue();
  public string ConfC => GetValue(); 


然而, 二般情况出现了... 优化编译并 IL-Repack 之后 --

 只读访问器的堆栈帧不见了!!! EXM?!

错误地取到上一个方法的名字, 导致配置读不出来 囧....

即使在 GetValue 方法加上了 NotInlining 的特性, 问题仍旧存在...

放狗出去找爆栈, 在不太相关的问题上看到有说用 CallerMemberName 可以.

用了之后才知道爽, 问题解决了!

标签: 软件开发 C#

评论(0) 引用(0) 浏览(1344)

Powered by emlog 去你妹的备案 sitemap