C#使用StackTrace、StackFrame、MethodBase获取当前属性时遇到的麻烦
2017-09-12 18:14
288 查看
有一个WCF项目,需要在GET、SET方法内部调用一个方法得到当前属性的名称。
在查阅一番之后,可以使用定位帧的方法得到相关的结果,代码如下:
在DEBUG编译模式下,能够获得正确的属性名称。
但是更换为RELEASE编译模式下,却报错提升不能获得属性。
如上面两张图片看出来,同样的frame.GetMethod(),一个获得的是属性里面的SET方法,一个获得的是调用此类的方法。这是导致此方法不能满足条件的原因。
由此可以看出Release在编译的时候,将引用类的指针从帧中删除掉了。
解决方法:
将NET4.0更换为NET4.5,此问题自动修复,说明NET4.5中编译时并不会省略引用类的指针。
另外一个方案如下:
以上方案是NET4.5出现的新特征
在查阅一番之后,可以使用定位帧的方法得到相关的结果,代码如下:
public string GetPN() { StackTrace trace = new StackTrace(true); StackFrame frame = trace.GetFrame(1);//1代表上级,2代表上上级,以此类推 MethodBase method = frame.GetMethod(); //获得当前方法名称 //Console.WriteLine(memberName); Console.WriteLine(method.Name); try { var property = (from f in method.DeclaringType.GetProperties() where f.GetSetMethod() == method || f.GetGetMethod() == method select f).FirstOrDefault(); return property.Name; } catch { return null; } }
在DEBUG编译模式下,能够获得正确的属性名称。
但是更换为RELEASE编译模式下,却报错提升不能获得属性。
如上面两张图片看出来,同样的frame.GetMethod(),一个获得的是属性里面的SET方法,一个获得的是调用此类的方法。这是导致此方法不能满足条件的原因。
由此可以看出Release在编译的时候,将引用类的指针从帧中删除掉了。
解决方法:
将NET4.0更换为NET4.5,此问题自动修复,说明NET4.5中编译时并不会省略引用类的指针。
另外一个方案如下:
public string GetPN([callerMemberName] string memberName="") { return memberName;//自动获得调用此方法的属性名称 }
以上方案是NET4.5出现的新特征
相关文章推荐
- SharePoint使用 C# 获取当前用户的SID
- ASP.NET中使用Razor语法(C#)怎样获取当前浏览器的cookie
- 使用可编辑JComboBox的时遇到的一个坑,编辑后如果JCombobox的焦点还在,则获取不到当前的编辑值。
- StackTrace和StackFrame使用笔记
- C#使用StackTrace获取方法被谁调用
- 如何使用C#操作快捷方式(获取快捷方式属性、创建快捷方式)
- C#获取时间戳的封装方法函数+使用获取当前时间时间戳
- C#中获取当前namespace和methodName(static上下文中也可用)
- 【C#】Observer设计模式委托事件的使用(获取Subject多个属性)
- 使用C#获取当前Windows所设定的时区
- [转]使用C#获取当前Windows所设定的时区
- C#遍历系统所安装的打印机,使用WMI方式获取打印机的所有属性
- 使用可编辑JComboBox的时遇到的一个坑,编辑后如果JCombobox的焦点还在,则获取不到当前的编辑值。
- 使用属性表达式获取属性名 C# .net
- C#遍历系统所安装的打印机,使用WMI方式获取打印机的所有属性
- 如何使用C#操作快捷方式(获取快捷方式属性、创建快捷方式)
- C# 使用定时任务 之 获取当前时间及格式化串
- .net C# 获取当前url各种属性(文件名、参数、域名 等)的方法
- 使用 C# 获取当前用户的SID
- c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段(转但是都是使用过)