1. 程式人生 > 實用技巧 >[轉]C# 特性學習之一、CallerMemberName、CallerFilePath和CallerLineNumber

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