呼叫端資訊 (C# 和 Visual Basic)
使用Caller Info的資訊屬性,您可以取得呼叫端的資訊加入至方法。 您可以從原始程式碼行號、原始程式碼和呼叫端的成員名稱的檔案路徑。 這項資訊來追蹤,以及建立診斷工具非常有用。
若要取得這項資訊,您會使用套用至可選擇參數的屬性,每個屬性都有預設值。 下表列出定義在 System.Runtime.CompilerServices 命名空間中的呼叫端資訊屬性:
屬性 |
描述 |
型別 |
[ T:System.Runtime.CompilerServices.CallerFilePathAttribute ] |
包含呼叫端原始程式檔的完整路徑。 這是在編譯時期的檔案路徑。 |
String |
[ T:System.Runtime.CompilerServices.CallerLineNumberAttribute ] |
方法被呼叫時原始程式檔的行號。 |
Integer |
[ T:System.Runtime.CompilerServices.CallerMemberNameAttribute ] |
方法或呼叫端的屬性名稱。 請參閱本主題稍後的討論內容 成員名稱。 |
String |
範例
下列範例顯示如何使用呼叫端資訊屬性。 在 [ TraceMessage ] 方法的每個呼叫時,呼叫端資訊會替代做為選擇性參數的引數。
' Imports System.Runtime.CompilerServices
' Imports System.Diagnostics
Private Sub DoProcessing()
TraceMessage("Something happened.")
End Sub
Public Sub TraceMessage(message As String,
<CallerMemberName> Optional memberName As String = Nothing,
<CallerFilePath> Optional sourcefilePath As String = Nothing,
<CallerLineNumber()> Optional sourceLineNumber As Integer = 0)
Trace.WriteLine("message: " & message)
Trace.WriteLine("member name: " & memberName)
Trace.WriteLine("source file path: " & sourcefilePath)
Trace.WriteLine("source line number: " & sourceLineNumber)
End Sub
' Sample output:
' message: Something happened.
' member name: DoProcessing
' source file path: C:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoVB\CallerInfoVB\Form1.vb
' source line number: 15
// using System.Runtime.CompilerServices
// using System.Diagnostics;
public void DoProcessing()
{
TraceMessage("Something happened.");
}
public void TraceMessage(string message,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{
Trace.WriteLine("message: " + message);
Trace.WriteLine("member name: " + memberName);
Trace.WriteLine("source file path: " + sourceFilePath);
Trace.WriteLine("source line number: " + sourceLineNumber);
}
// Sample Output:
// message: Something happened.
// member name: DoProcessing
// source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs
// source line number: 31
備註
您必須為每個選擇性參數指定明確的預設值。 您無法將呼叫端資訊屬性套用至未指定為選擇性的參數。
呼叫端資訊屬性無法讓一個參數成為選擇性。 相反地,它們會影響被傳入的預設值,當這個引數被略過時。
在編譯時期,呼叫端資訊值發出以常值的型別 Intermediate Language (IL)。 不同於 StackTrace 屬性所造成的例外狀況,其結果並不會被模糊化所影響。
成員名稱
您可以使用 CallerMemberName 屬性來避免指定成員名稱做為 String 引數傳遞至呼叫的方法。 您可以使用這個技巧,可以避免 [重新命名重構。] 不會變更 String 值這個問題。 這項優點為下列工作特別有用 :
使用追蹤和診斷行程。
實作 INotifyPropertyChanged 介面,當繫結資料時。 這個介面允許物件的屬性告知繫結控制項的屬性已變更,所以控制項可以顯示更新資訊。 沒有 CallerMemberName 屬性,您必須指定屬性名稱為常值。
下圖顯示傳回的成員名稱,當您使用 CallerMemberName 屬性時。
內部發生呼叫 |
成員名稱結果 |
---|---|
方法、屬性或事件。 |
方法的名稱,屬性,或產生此呼叫的事件。 |
建構函式 |
字串「.ctor」 |
靜態建構函式 |
字串「.cctor」 |
解構函式 |
字串「完成」 |
使用者定義的運算子或轉換 |
產生的名稱給成員,例如, 「op_Addition」。 |
屬性建構函式 |
屬性套用到成員的名稱。 如果屬性為成員內的任何項目 (例如參數、傳回值或泛型型別參數),結果是與該項目有關的成員名稱。 |
未包含的成員 (例如,組件層級或屬性套用至型別的話)。 |
設定參數的預設值。 |