Поделиться через


Сведения о вызывающем объекте (Visual Basic)

С помощью атрибутов сведений о вызывающем методе можно получить информацию о вызывающей стороне. Вы можете получить путь к файлу исходного кода, номер строки в исходном коде и имя участника вызывающего объекта. Эта информация полезна для трассировки, отладки и создания средств диагностики.

Чтобы получить эти сведения, используйте атрибуты, применяемые к необязательным параметрам, каждый из которых имеет значение по умолчанию. В следующей таблице перечислены атрибуты сведений о вызывающем объекте, определенные в пространстве имен System.Runtime.CompilerServices.

Свойство Описание Тип
CallerFilePathAttribute Полный путь к исходному файлу, который содержит вызывающий объект. Это путь к файлу во время компиляции. String
CallerLineNumberAttribute Номер строки в исходном файле, в котором вызывается метод. Integer
CallerMemberNameAttribute Имя метода или свойства вызывающего. См. имена участников далее в этом разделе. String
CallerArgumentExpressionAttribute Выражение, используемое вызывающей стороной для аргументации. См. статью "Выражения вызывающего абонента " далее в этом разделе. String

Пример

В следующем примере показано, как использовать атрибуты сведений о вызывающем объекте. При каждом вызове метода информация о вызывающем подставляется в аргументы необязательных параметров.

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  

Замечания

Необходимо указать явное значение по умолчанию для каждого необязательного параметра. Атрибуты сведений о вызывающем объекте нельзя применять к параметрам, которые не указаны как необязательные.

Атрибуты информации о вызывающем объекте не делают параметр необязательным. Вместо этого они влияют на значение по умолчанию, передаваемое при опущении аргумента.

Значения информации о вызывающем интегрируются в виде литералов в промежуточный язык (IL) на этапе компиляции. В отличие от результатов свойства StackTrace для исключений, результаты не зависят от скрытия.

Вы можете явно указать необязательные аргументы для управления информацией о вызывающем абоненте или скрытия информации о вызывающем абоненте.

Имена членов

Атрибут можно использовать CallerMemberName , чтобы избежать указания имени члена в качестве String аргумента вызываемого метода. С помощью этого метода можно избежать проблемы, что Рефакторинг Переименования не изменяет значения String. Это преимущество особенно полезно для следующих задач:

  • Использование процедур трассировки и диагностики.

  • Реализация интерфейса INotifyPropertyChanged при привязке данных. Этот интерфейс позволяет свойству объекта уведомлять привязанный элемент управления о том, что свойство изменилось, чтобы элемент управления отображал обновленные сведения. Без атрибута CallerMemberName необходимо указать как литерал имя свойства.

На следующей диаграмме показаны имена элементов, возвращаемые при использовании атрибута CallerMemberName .

Вызовы происходят в пределах Результат имени участника
Метод, свойство или событие Имя метода, свойства или события, из которого исходит вызов.
Конструктор строка ".ctor"
Статический конструктор Строка ".cctor"
Разрушитель Строка "Завершить"
Определяемые пользователем операторы или преобразования Генерированное имя члена, например «op_Addition».
Конструктор атрибутов Имя элемента, к которому применяется атрибут. Если атрибут является любым элементом в элементе (например, параметром, возвращаемым значением или параметром универсального типа), это имя элемента, связанного с этим элементом.
Отсутствие содержащего элемента (например, уровня сборки или атрибутов, применяемых к типам) Значение по умолчанию необязательного параметра.

Выражения вызывающего абонента

Вы используете, System.Runtime.CompilerServices.CallerArgumentExpressionAttribute когда вы хотите записать выражение, используемое для аргумента. Библиотекам диагностики может потребоваться предоставить дополнительные сведения о выражениях, переданных в качестве аргументов. Предоставляя выражение, которое вызвало диагностику, а также имя параметра, разработчики получают более подробную информацию об условии, которое вызвало диагностику. Эта дополнительная информация упрощает исправление. В следующем методе CallerArgumentExpressionAttribute используется для отображения условия, которое должно быть True:

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

См. также