在開發中經常會寫個公有靜態類記錄日志,如下:
/// <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"。 |
特性構造函數 |
特性所應用的成員的名稱 |
參考鏈接: