通過使用調用方信息特性,可獲取有關方法的調用方的信息。 可以獲取源代碼的文件路徑、源代碼中的行號和調用方的成員名稱。 此信息有助於跟蹤、調試和創建診斷工具。若要獲取此信息,可以使用應用於可選參數的特性,每個特性都具有默認值。 下表列出在 System.Runtime.CompilerServices 命名空間中定義的調用方信息特性:
特性 | 描述 | 類型 |
---|---|---|
CallerFilePathAttribute | 包含調用方的源文件的完整路徑。 這是編譯時的文件路徑。 | String |
CallerLineNumberAttribute | 源文件中調用方法的行號。 | Integer |
CallerMemberNameAttribute | 調用方的方法或屬性名稱。 請參閱本主題后面的成員名稱。 | String |
示例
下面的示例演示如何使用調用方信息特性。 每次調用 TraceMessage
方法時,調用方信息將替換為可選參數的變量。
1 public void DoProcessing() 2 { 3 TraceMessage("Something happened."); 4 } 5 6 public void TraceMessage(string message, 7 [System.Runtime.CompilerServices.CallerMemberName] string memberName = "", 8 [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "", 9 [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0) 10 { 11 System.Diagnostics.Trace.WriteLine("message: " + message); 12 System.Diagnostics.Trace.WriteLine("member name: " + memberName); 13 System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath); 14 System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber); 15 } 16 17 // 輸出結果: 18 // message: Something happened. 19 // member name: DoProcessing 20 // source file path: c:\Visual Studio Projects\CallerInfoCS\CallerInfoCS\Form1.cs 21 // source line number: 31
備注
你必須為每個可選參數指定顯式默認值。 不能將調用方信息特性應用於未指定為可選的參數。
調用方信息特性不會使參數成為可選參數。 相反,它們會在忽略此參數時影響傳入的默認值。
在編譯時,調用方信息值將作為文本傳入中間語言 (IL)。 與異常的 StackTrace 屬性的結果不同,這些結果不受模糊處理的影響。
你可顯式提供可選參數來控制調用方信息或隱藏調用方信息。
成員名稱
可以使用 CallerMemberName
特性來避免將成員名稱指定為所調用的方法的 String
參數。 通過使用這種技術,可以避免“重命名重構”不更改 String
值的問題。 此好處對於以下任務特別有用:
-
使用跟蹤和診斷例程。
-
在綁定數據時實現 INotifyPropertyChanged 接口。 此接口允許對象的屬性通知綁定控件該屬性已更改,以便此控件能夠顯示更新的信息。 如果沒有
CallerMemberName
特性,則必須將屬性名稱指定為文本。
以下圖表顯示在使用 CallerMemberName
特性時返回的成員名稱。
調用發生中 | 成員名稱結果 |
---|---|
方法、屬性或事件 | 從中發起調用的方法、屬性或事件的名稱。 |
構造函數 | 字符串“.ctor” |
靜態構造函數 | 字符串“.cctor” |
析構函數 | 字符串“Finalize” |
用戶定義的運算符或轉換 | 為成員生成的名稱,例如,“op_Addition”。 |
特性構造函數 | 要應用特性的方法或屬性的名稱。 如果該特性是成員中的任何元素(如參數、返回值或泛型參數),則此結果是與該元素關聯的成員的名稱。 |
無包含的成員(例如,程序集級別或應用於類型的特性) | 可選參數的默認值。 |