C#使用StackTrace、StackFrame、MethodBase获取当前属性时遇到的麻烦

2017-09-13 10:24:10来源:网络收集作者:咖啡不加糖人点击

分享

有一个WCF项目,需要在GET、SET方法内部调用一个方法得到当前属性的名称。


在查阅一番之后,可以使用定位帧的方法得到相关的结果,代码如下:


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编译模式下,能够获得正确的属性名称。
C#使用StackTrace、StackFrame、MethodBase获取当前属性时遇到的麻烦
但是更换为RELEASE编译模式下,却报错提升不能获得属性。
C#使用StackTrace、StackFrame、MethodBase获取当前属性时遇到的麻烦


如上面两张图片看出来,同样的frame.GetMethod(),一个获得的是属性里面的SET方法,一个获得的是调用此类的方法。这是导致此方法不能满足条件的原因。


由此可以看出Release在编译的时候,将引用类的指针从帧中删除掉了。


解决方法:
将NET4.0更换为NET4.5,此问题自动修复,说明NET4.5中编译时并不会省略引用类的指针。
另外一个方案如下:


public string GetPN([callerMemberName] string memberName="")
{
return memberName;//自动获得调用此方法的属性名称
}

以上方案是NET4.5出现的新特征




最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台