Сведения о вызывающем объекте
С помощью информационных атрибутов вызывающего объекта можно получить сведения о вызывающем объекте метода. Можно получить путь к файлу исходного кода, номер строки в исходном коде и имя вызывающего объекта. Эти сведения полезны для трассировки, отладки и создания средств диагностики.
Для получения этих сведений используются атрибуты, которые применяются к необязательным параметрам, каждый из которых имеет значение по умолчанию. В следующей таблице перечислены атрибуты сведений о вызывающем объекте, определенные в пространстве имен System.Runtime.CompilerServices :
Атрибут | Описание | Тип |
---|---|---|
CallerFilePath | Полный путь исходного файла, содержащего вызывающий объект. Это путь к файлу во время компиляции. | String |
CallerLineNumber | Номер строки в исходном файле, в которой вызывается метод. | Integer |
CallerMemberName | Имя свойства или метода вызывающего объекта. См. раздел "Имена участников" далее в этом разделе. | String |
Пример
В следующем примере показано, как использовать эти атрибуты для трассировки вызывающего объекта.
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}")
Замечания
Атрибуты сведений о вызывающем объекте могут применяться только к необязательным параметрам. Атрибуты сведений вызывающего абонента приводят к тому, что компилятор записывает правильное значение для каждого необязательного параметра, украшенного атрибутом Caller Info.
Информационные значения вызывающего объекта передаются как литералы в IL во время компиляции. В отличие от результатов свойства StackTrace для исключений, результаты не затрагиваются с помощью маскировки.
Можно явно передать необязательные аргументы, чтобы управлять сведениями о вызывающем объекте или скрывать сведения о вызывающем объекте.
Имена членов
Можно использовать атрибут CallerMemberName
, чтобы не указывать имя члена в виде аргумента String
вызываемому методу. С помощью этого метода можно избежать проблемы, из-за которой переименовывать String
рефакторинг не изменяются значения. Это особенно полезно при выполнении следующих задач:
- Использование процедур трассировки и диагностики.
- Реализация интерфейса INotifyPropertyChanged при привязке данных. Этот интерфейс позволяет свойству объекта уведомлять связанный элемент управления об изменении свойства, чтобы элемент управления мог отображать обновленные сведения. Если атрибут
CallerMemberName
не используется, необходимо указать имя свойства как литерал.
На следующей диаграмме показаны имена элементов, возвращаемые при использовании атрибута CallerMemberName.
Фрагмент кода, в пределах которого происходит вызов | Результат имени члена |
---|---|
Метод, свойство или событие | Имя метода, свойства или события, из которого происходил вызов. |
Конструктор | Строка ".ctor" |
Статический конструктор | Строка ".cctor" |
Деструктор | Строка "Finalize" |
Определяемые пользователем операторы и преобразования | Созданное имя члена, например, "op_Addition". |
Конструктора атрибута | Имя члена, к которому применяется атрибут. Если атрибут — любой элемент внутри члена (например, параметр, возвращаемое значение или параметр универсального типа), то результат — имя члена, который связан с этим элементом. |
Нет содержащего члена (например, уровень сборки или атрибуты, примененные к типам) | Значение необязательного параметра по умолчанию. |