首页 > 代码库 > C# 特性学习之一、CallerMemberName、CallerFilePath和CallerLineNumber
C# 特性学习之一、CallerMemberName、CallerFilePath和CallerLineNumber
在开发中经常会写个公有静态类记录日志,如下:
/// <summary> /// Writes the error. /// </summary> /// <param name="message">The message to be written.</param> public void WriteError(object message) { _log4Net.Error(message); }
如果想区分调用来源就比较麻烦了。在.Net 4.5中引入了三个Attribute:CallerMemberName、CallerFilePath和CallerLineNumber 。在编译器的配合下,分别可以获取到调用函数(准确讲应该是成员)名称,调用文件及调用行号。这时可以把方法改成:
/// <summary> /// Writes an error level logging message. /// </summary> /// <param name="message">The message to be written.</param> public void WriteError(object message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) { _log4Net.ErrorFormat("文件:{0} 行号:{1} 方法名:{2},消息:{3}", sourceFilePath, sourceLineNumber, memberName, message); }
这样就可以区分调用来源了。另外,在构造函数,析构函数、属性等特殊的地方调用CallerMemberName属性所标记的函数时,获取的值有所不同,其取值如下表所示:
调用的地方 | CallerMemberName获取的结果 |
方法、属性或事件 | 方法,属性或事件的名称 |
构造函数 | 字符串 ".ctor" |
静态构造函数 | 字符串 ".cctor" |
析构函数 | 该字符串 "Finalize" |
用户定义的运算符或转换 | 生成的名称成员,例如, "op_Addition"。 |
特性构造函数 | 特性所应用的成员的名称 |
参考链接:
使用CallerMemberName简化InotifyPropertyChanged的实现
C# 5.0中新增特性
C# 特性学习之一、CallerMemberName、CallerFilePath和CallerLineNumber
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。