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中新增特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM