注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

得到当前正在运行的方法或属性名[C#]  

2012-04-18 22:50:08|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
得到当前正在运行的方法或属性名[C] - 秒大刀 - 秒大刀 博客
     C/C++在编译时有个__FUNCTION__宏可以获取当前的方法名,而C#中并没有这样的预处理宏,无法在编译时获得函数名信息。但C#中却可以通过反射来在运行时拿到这些信息。MethodBase.GetCurrentMethod().Name就是一个很好的渠道; 而通过指定可忽略的栈深度new StackFrame(0).GetMethod().Name提供了更大的灵活性。
    以上方法在可以方便得到普通函数的名称,但将其用于属性(Property)时,会得到get_Property或set_Property这样被修饰过的名字。如果我们要得到代码中的属性名,需要将签名的get_和set_修饰去掉。当然不能简单的进行Substring(4),否则就无法和用户定义的get_UserMethod方法区分。这是个问题...

public static string GetMethodName()
{
         var method = new StackFrame(1).GetMethod(); // 这里忽略1层堆栈,也就忽略了当前方法GetMethodName,这样拿到的就正好是外部调用GetMethodName的方法信息
         var property = (
                   from p in method.DeclaringType.GetProperties(
                            BindingFlags.Instance |
                            BindingFlags.Static |
                            BindingFlags.Public |
                            BindingFlags.NonPublic)
                   where p.GetGetMethod(true) == method || p.GetSetMethod(true) == method
                   select p).FirstOrDefault();
         return property == null ? method.Name : property.Name;
}

    以上通过将当前MethodInfo和调用者类型中所有的PropertyInfo对应的get或set的MethodInfo进行比对,以鉴别调用者是属性,然后再相应的返回属性名或方法名。


参考:

2013-1-25
    C# 4.5开始,可以采用CallerMemberName特性来获得调用属性或方法的名称。如此实现INotifyPropertyChanged就简捷多了:

public event PropertyChangedEventHandler PropertyChanged;

// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.

private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}



2013-1-26
    By using Caller Info attributes, you can obtain information about the caller to a method. You can obtain file path of the source code, the line number in the source code, and the member name of the caller. This information is helpful for tracing, debugging, and creating diagnostic tools.[MSDN]
    But you can't get the calling instance with method via reflection or diagnostics. [stackoverflow]
  评论这张
 
阅读(4464)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017