Informacje o obiekcie wywołującym (Visual Basic)
Przy użyciu atrybutów informacji o obiekcie wywołującym można uzyskać informacje o obiekcie wywołującym metodę. Można uzyskać ścieżkę pliku kodu źródłowego, numer wiersza kodu źródłowego i nazwę elementu członkowskiego obiektu wywołującego. Te informacje są przydatne do śledzenia, debugowania i tworzenia narzędzi diagnostycznych.
Aby uzyskać te informacje, należy użyć atrybutów stosowanych do opcjonalnych parametrów, z których każdy ma wartość domyślną. W poniższej tabeli wymieniono atrybuty informacji o obiekcie wywołującym System.Runtime.CompilerServices zdefiniowane w przestrzeni nazw:
Atrybut | opis | Type |
---|---|---|
CallerFilePathAttribute | Pełna ścieżka pliku źródłowego zawierającego obiekt wywołujący. Jest to ścieżka pliku w czasie kompilacji. | String |
CallerLineNumberAttribute | Numer wiersza w pliku źródłowym, w którym to wierszu jest wywoływana metoda. | Integer |
CallerMemberNameAttribute | Nazwa metody lub właściwości obiektu wywołującego. Zobacz Nazwy członków w dalszej części tego tematu. | String |
CallerArgumentExpressionAttribute | Wyrażenie używane przez obiekt wywołujący dla argumentu. Zobacz Wyrażenia wywołujące w dalszej części tego tematu. | String |
Przykład
Poniższy przykład przedstawia, jak używać atrybutów informacji o obiekcie wywołującym. W każdym wywołaniu TraceMessage
metody informacje wywołujące są zastępowane jako argumenty parametrów opcjonalnych.
Private Sub DoProcessing()
TraceMessage("Something happened.")
End Sub
Public Sub TraceMessage(message As String,
<System.Runtime.CompilerServices.CallerMemberName> Optional memberName As String = Nothing,
<System.Runtime.CompilerServices.CallerFilePath> Optional sourcefilePath As String = Nothing,
<System.Runtime.CompilerServices.CallerLineNumber()> Optional sourceLineNumber As Integer = 0)
System.Diagnostics.Trace.WriteLine("message: " & message)
System.Diagnostics.Trace.WriteLine("member name: " & memberName)
System.Diagnostics.Trace.WriteLine("source file path: " & sourcefilePath)
System.Diagnostics.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
Uwagi
Należy jawnie określić wartość domyślną dla każdego opcjonalnego parametru. Nie można zastosować atrybutów informacji o obiekcie wywołującym do parametrów, które nie są określone jako opcjonalne.
Atrybuty informacji o obiekcie wywołującym nie czynią parametru opcjonalnym. Zamiast tego wpływają na domyślną wartość, która jest przekazywana, gdy argument zostanie pominięty.
Wartości informacji o obiekcie wywołującym są emitowane jako literały do języka pośredniego (IL, Intermediate Language) w czasie kompilacji. W przeciwieństwie do wyników StackTrace właściwości wyjątków, wyniki nie mają wpływu na zaciemnianie.
Można jawnie dostarczyć opcjonalne argumenty do sterowania informacjami o obiekcie wywołującym lub ukryć te informacje.
Nazwy elementów członkowskich
Możesz użyć atrybutu CallerMemberName
, aby uniknąć określania nazwy elementu członkowskiego jako String
argumentu do wywoływanej metody. Korzystając z tej techniki, należy uniknąć problemu, który refaktoryzacja zmiany nazwy nie zmienia String
wartości. Jest to szczególnie przydatne w następujących zadaniach:
Używanie procedur do śledzenia i diagnostycznych.
Implementowanie interfejsu INotifyPropertyChanged podczas wiązania danych. Ten interfejs umożliwia właściwości obiektu powiadamianie powiązanego formantu, że właściwość zmieniła się, dzięki czemu formant może wyświetlić zaktualizowane informacje. Bez atrybutu
CallerMemberName
należy określić nazwę właściwości jako literał.
Na poniższym wykresie przedstawiono nazwy elementów członkowskich zwracane podczas używania atrybutu CallerMemberName
.
Wywołanie ma miejsce w | Wynikowa nazwa elementu członkowskiego |
---|---|
Metoda, właściwość lub zdarzenie | Nazwa metody, właściwości lub zdarzenia, gdzie zainicjowane było wywołanie. |
Konstruktor | Ciąg „.ctor” |
Statyczny konstruktor | Ciąg „.cctor” |
Destruktor | Ciąg „Finalize”. |
Zdefiniowane przez użytkownika operatory lub konwersje | Nazwa wygenerowana dla elementu członkowskiego, na przykład „op_Addition”. |
Konstruktor atrybutu | Nazwa elementu członkowskiego, do którego został zastosowany atrybut. Jeśli atrybut jest dowolnym elementem elementu członkowskiego (takim jak parametr, wartość zwracana lub parametr typu ogólnego), to wynikiem jest nazwa elementu członkowskiego, który jest skojarzony z tym elementem. |
Brak nadrzędnego elementu członkowskiego (na przykład poziom zestawu lub atrybuty, które są stosowane do typów) | Wartość domyślna opcjonalnego parametru. |
Wyrażenia wywołujące
Używasz elementu System.Runtime.CompilerServices.CallerArgumentExpressionAttribute , gdy chcesz przechwycić wyrażenie używane dla argumentu. Biblioteki diagnostyczne mogą chcieć podać więcej szczegółów na temat wyrażeń przekazanych jako argumenty. Podając wyrażenie, które wyzwoliło diagnostykę, oprócz nazwy parametru, deweloperzy mają więcej szczegółów na temat warunku, który wyzwolił diagnostykę. Te dodatkowe informacje ułatwiają naprawienie. Poniższa metoda używa elementu , CallerArgumentExpressionAttribute aby wyświetlić warunek, który musi mieć True
wartość :
Public Shared Sub ValidateArgument(ByVal parameterName As String,
ByVal condition As Boolean,
<CallerArgumentExpression("condition")> ByVal Optional message As String? = Nothing)
If Not condition Then
Throw New ArgumentException($"Argument failed validation: <{message}>", parameterName)
End If
End Sub