.net4.0及以下实现CallerMemberName的方法

从.Net 4.5开始提供了CallerMemberName这个Attribute可以获得调用方法的成员名称,这个用来实现数据绑定中简化实现INotifyPropertyChanged接口很有帮助。
但是在.Net 4.0及之前是不支持的,可以使用StackTrace达到同样的目的:
new StackTrace(true).GetFrame(1).GetMethod().Name
 
就可以获得调用当前方法的方法名。
 
原理就是StackTrace类获得的是当前的调用堆栈,堆栈中第0个是当前方法,堆栈中第1个方法就是调用当前方法的方法。
 
如果想获得属性名,则通过下面的方法来从get_Id这样的方法名中取出属性名:
        private static string GetProperyName(string methodName)
        {
            if (methodName.StartsWith("get_") || methodName.StartsWith("set_") ||
                methodName.StartsWith("put_"))
            {
                return methodName.Substring("get_".Length);
            }
            throw new Exception(methodName+" not a method of Property");
        }
 
 
 
下面就是兼容旧版本.Net的BindableBase:
    class BindableBase:INotifyPropertyChanged
    {
        private Dictionary<string, object> dict = new Dictionary<string, object>();
 
        private static string GetProperyName(string methodName)
        {
            if (methodName.StartsWith("get_") || methodName.StartsWith("set_") ||
                methodName.StartsWith("put_"))
            {
                return methodName.Substring("get_".Length);
            }
            throw new Exception(methodName+" not a method of Property");
        }
 
        protected void SetValue(object value)
        {
            string propertyName = GetProperyName(new StackTrace(true).GetFrame(1).GetMethod().Name);
            dict[propertyName] = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
 
        protected object GetValue()
        {
            string propertyName = GetProperyName(new StackTrace(true).GetFrame(1).GetMethod().Name);
            if (dict.ContainsKey(propertyName))
            {
                return dict[propertyName];
            }
            else
            {
                return null;
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
    }
 
当然这个方式使用的是StackTrace,性能略低于CallerMemberName。

如鹏网.Net培训班正在报名,有网络的地方就可以参加如鹏网的学习,学完就能高薪就业,点击此处了解

 

    三年前只要懂“三层架构”就可以说“精通分层架构”;现在则需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值钱;

    三年前只要会SQLServer就可以说自己“精通数据库开发”;现在则需还需要掌握MySQL等开源数据库才能说是“.Net开源”时代的程序员;

    三年前只要会进行用户上传内容的安全性处理即可;现在则需要熟悉云存储、CDN等才能在云计算时代游刃有余;

    三年前只要掌握Lucene.Net就会说自己“熟悉站内搜索引擎开发”;现在大家都用ElasticSearch了,你还用Lucene.Net就太老土了;

    三年前发邮件还是用SmtpClient;现在做大型网站发邮件必须用云邮件引擎;

    三年前缓存就是Context.Cache;现在则是Redis、Memcached的天下;

    如鹏网再次引领.Net社区技术潮流!点击此处了解如鹏网.Net最新课程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值