Informacje o wywołującym
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 info obiektu wywołującego zdefiniowane w przestrzeni nazw System.Runtime.CompilerServices :
Atrybut | opis | Type |
---|---|---|
CallerFilePath | Pełna ścieżka pliku źródłowego zawierającego obiekt wywołujący. Jest to ścieżka pliku w czasie kompilacji. | String |
CallerLineNumber | Numer wiersza w pliku źródłowym, w którym to wierszu jest wywoływana metoda. | Integer |
Callermembername | Nazwa metody lub właściwości obiektu wywołującego. Zobacz sekcję Nazwy składowych w dalszej części tego tematu. | String |
Przykład
W poniższym przykładzie pokazano, jak można użyć tych atrybutów do śledzenia elementu wywołującego.
open System.Diagnostics
open System.Runtime.CompilerServices
open System.Runtime.InteropServices
type Tracer() =
member _.DoTrace(message: string,
[<CallerMemberName; Optional; DefaultParameterValue("")>] memberName: string,
[<CallerFilePath; Optional; DefaultParameterValue("")>] path: string,
[<CallerLineNumber; Optional; DefaultParameterValue(0)>] line: int) =
Trace.WriteLine(sprintf $"Message: {message}")
Trace.WriteLine(sprintf $"Member name: {memberName}")
Trace.WriteLine(sprintf $"Source file path: {path}")
Trace.WriteLine(sprintf $"Source line number: {line}")
Uwagi
Atrybuty informacji o obiekcie wywołującym można zastosować tylko do parametrów opcjonalnych. Atrybuty informacji o obiekcie wywołującym powodują, że kompilator zapisuje odpowiednią wartość dla każdego opcjonalnego parametru ozdobionego atrybutem Info elementu wywołującego.
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 dla 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. |