[轉]C# 特性學習之一、CallerMemberName、CallerFilePath和CallerLineNumber
阿新 • • 發佈:2020-07-24
原文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"。 |
特性建構函式 |
特性所應用的成員的名稱 |
參考連結: