Udostępnij za pośrednictwem


Informacje o wywołującym (C# i 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 podano atrybuty informacji o obiekcie wywołującym zdefiniowane w przestrzeni nazw System.Runtime.CompilerServices:

Atrybut

Opis

Typ

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 elementów członkowskich dalej w tym temacie.

String

Przykład

Poniższy przykład przedstawia, jak używać atrybutów informacji o obiekcie wywołującym.Przy każdym wywołaniu metody TraceMessage informacje o obiekcie wywołującym są podstawiane jako argumenty opcjonalnych parametrów.

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
public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 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);
}

// 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

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 właściwości StackTrace wyjątków, na wyniki nie ma wpływu zasłanianie.

Można jawnie dostarczyć opcjonalne argumenty do sterowania informacjami o obiekcie wywołującym lub ukryć te informacje.

Nazwa elementów członkowskich

Można użyć atrybutu CallerMemberName, aby uniknąć określania nazwy elementu członkowskiego jako argumentu String wywoływanej metody.Korzystając z tej techniki, można uniknąć problemu, że Refaktoryzacja zmiany nazwy nie zmienia wartości String.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 konieczne jest określenie nazwy właściwości jako literał.

Na poniższym wykresie przedstawiono nazwy elementów członkowskich zwracanych, gdy jest używany atrybut 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.

Zobacz też

Informacje

Atrybuty (C# i Visual Basic)

Koncepcje

Atrybuty wspólne (C# and Visual Basic)

Parametry opcjonalne (Visual Basic)

Argumenty nazwane i opcjonalne (Przewodnik programowania w języku C#)

Inne zasoby

Koncepcje programowania