C# 特性学习之CallerMemberNameCallerFilePath和CallerLineNumber

Posted Zeroes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 特性学习之CallerMemberNameCallerFilePath和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# 特性学习之CallerMemberNameCallerFilePath和CallerLineNumber的主要内容,如果未能解决你的问题,请参考以下文章

Shell学习之Shell特性

python学习之高级特性

python学习之3高级特性(廖雪峰)

C#学习之--Hellow World

Unity基础学习之C#学习

python学习之面向对象高级特性