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

来源:互联网 发布:mac os x 更新 编辑:程序博客网 时间:2024/05/21 06:16

有一个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出现的新特征

原创粉丝点击