標籤:ber path href fan code 名稱 pre cto 建構函式
在開發中經常會寫個公有靜態類記錄日誌,如下:
/// <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