通过使用调用方信息属性,可以获取有关方法调用方的信息。 可以获取源代码的文件路径、源代码中的行号和调用方的成员名称。 此信息有助于跟踪、调试和创建诊断工具。
若要获取此信息,请使用应用于可选参数的属性,每个参数都具有默认值。 下表列出了命名空间中 System.Runtime.CompilerServices 定义的调用方信息属性:
特征 | DESCRIPTION | 类型 |
---|---|---|
CallerFilePathAttribute | 包含调用方的源文件的完整路径。 这是编译时的文件路径。 | String |
CallerLineNumberAttribute | 调用方法的源文件中的行号。 | Integer |
CallerMemberNameAttribute | 调用方的方法或属性名称。 请参阅本主题后面的 成员名称 。 | String |
CallerArgumentExpressionAttribute | 调用方用于实参的表达式。 请参阅本主题后面的 调用方表达式 。 | String |
示例:
以下示例演示如何使用调用方信息属性。 每次调用TraceMessage
方法时,都会将调用者信息作为可选参数的实参传递进去。
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” |
破坏者 | 字符串“Finalize” |
用户定义的运算符或转换 | 为成员生成的名称,例如,“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