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ć Truewartość :

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

Zobacz też