您的位置:首页 > 编程语言 > C#

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

2017-09-12 18:14 288 查看
有一个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编译模式下,能够获得正确的属性名称。



但是更换为RELEASE编译模式下,却报错提升不能获得属性。



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

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

解决方法:

将NET4.0更换为NET4.5,此问题自动修复,说明NET4.5中编译时并不会省略引用类的指针。

另外一个方案如下:

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


以上方案是NET4.5出现的新特征
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# wcf string