zoukankan      html  css  js  c++  java
  • [转]C# 特性学习之一、CallerMemberName、CallerFilePath和CallerLineNumber

    原文 https://www.cnblogs.com/zeroes/p/6031651.html?utm_source=itdadao&utm_medium=referral

    在开发中经常会写个公有静态类记录日志,如下:

    复制代码
        /// <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中新增特性

  • 相关阅读:
    VUE 路由
    JS小表达式
    JS正则表达式
    react案例—实现组件之间的通信
    React脚手架搭建
    react属性三ref
    react属性二props
    java多线程2
    jvm小结2
    spark小结3
  • 原文地址:https://www.cnblogs.com/hurui1/p/13370518.html
Copyright © 2011-2022 走看看