Сведения о вызывающем объекте (C#)Caller Information (C#)

С помощью информационных атрибутов вызывающего объекта можно получить сведения о вызывающем объекте метода.By using Caller Info attributes, you can obtain information about the caller to a method. Можно получить путь к файлу исходного кода, номер строки в исходном коде и имя вызывающего объекта.You can obtain file path of the source code, the line number in the source code, and the member name of the caller. Эти сведения полезны для трассировки, отладки и создания средств диагностики.This information is helpful for tracing, debugging, and creating diagnostic tools.

Для получения этих сведений используются атрибуты, которые применяются к необязательным параметрам, каждый из которых имеет значение по умолчанию.To obtain this information, you use attributes that are applied to optional parameters, each of which has a default value. В следующей таблице перечислены информационные атрибуты вызывающего объекта, которые определены в пространстве имен System.Runtime.CompilerServices:The following table lists the Caller Info attributes that are defined in the System.Runtime.CompilerServices namespace:

АтрибутAttribute ОПИСАНИЕDescription ТипType
CallerFilePathAttribute Полный путь исходного файла, содержащего вызывающий объект.Full path of the source file that contains the caller. Это путь к файлу во время компиляции.This is the file path at compile time. String
CallerLineNumberAttribute Номер строки в исходном файле, в которой вызывается метод.Line number in the source file at which the method is called. Integer
CallerMemberNameAttribute Имя свойства или метода вызывающего объекта.Method or property name of the caller. См. подраздел Имена членов ниже.See Member Names later in this topic. String

ПримерExample

В следующем примере показано, как использовать информационные атрибуты вызывающего объекта.The following example shows how to use Caller Info attributes. При каждом вызове метода TraceMessage сведения о вызывающем объекте подставляются в качестве аргументов необязательных параметров.On each call to the TraceMessage method, the caller information is substituted as arguments to the optional parameters.

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:\Visual Studio Projects\CallerInfoCS\CallerInfoCS\Form1.cs
//  source line number: 31

ПримечанияRemarks

Для каждого необязательного параметра необходимо указать явное значение по умолчанию.You must specify an explicit default value for each optional parameter. Нельзя применять информационные атрибуты вызывающего объекта к параметрам, которые не были указаны как необязательные.You can't apply Caller Info attributes to parameters that aren't specified as optional.

Информационные атрибуты вызывающего объекта не делают параметр необязательным.The Caller Info attributes don't make a parameter optional. Вместо этого они влияют на значение по умолчанию, которое передается, если аргумент был опущен.Instead, they affect the default value that's passed in when the argument is omitted.

Информационные значения вызывающего объекта передаются как литералы в IL во время компиляции.Caller Info values are emitted as literals into the Intermediate Language (IL) at compile time. В отличие от результатов свойства StackTrace для исключений, результаты не затрагиваются запутыванием кода.Unlike the results of the StackTrace property for exceptions, the results aren't affected by obfuscation.

Можно явно передать необязательные аргументы, чтобы управлять сведениями о вызывающем объекте или скрывать сведения о вызывающем объекте.You can explicitly supply the optional arguments to control the caller information or to hide caller information.

Имена членовMember names

Можно использовать атрибут CallerMemberName, чтобы не указывать имя члена в виде аргумента String вызываемому методу.You can use the CallerMemberName attribute to avoid specifying the member name as a String argument to the called method. Этот прием позволяет избежать проблемы, заключающейся в том, что операция рефакторинга и переименования не изменяет значений String.By using this technique, you avoid the problem that Rename Refactoring doesn't change the String values. Это особенно полезно при выполнении следующих задач:This benefit is especially useful for the following tasks:

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

  • Реализация интерфейса INotifyPropertyChanged при привязке данных.Implementing the INotifyPropertyChanged interface when binding data. Этот интерфейс позволяет свойству объекта уведомлять связанный элемент управления об изменении свойства, чтобы элемент управления мог отображать обновленные сведения.This interface allows the property of an object to notify a bound control that the property has changed, so that the control can display the updated information. Если атрибут CallerMemberName не используется, необходимо указать имя свойства как литерал.Without the CallerMemberName attribute, you must specify the property name as a literal.

В следующей таблице представлены имена членов, возвращаемых при использовании атрибута CallerMemberName.The following chart shows the member names that are returned when you use the CallerMemberName attribute.

Фрагмент кода, в пределах которого происходит вызовCalls occurs within Результат имени членаMember name result
Метод, свойство или событиеMethod, property, or event Имя метода, свойства или события, из которого происходил вызов.The name of the method, property, or event from which the call originated.
КонструкторConstructor Строка ".ctor"The string ".ctor"
Статический конструкторStatic constructor Строка ".cctor"The string ".cctor"
ДеструкторDestructor Строка "Finalize"The string "Finalize"
Определяемые пользователем операторы и преобразованияUser-defined operators or conversions Созданное имя члена, например, "op_Addition".The generated name for the member, for example, "op_Addition".
Конструктора атрибутаAttribute constructor Имя метода или свойства, к которому применяется атрибут.The name of the method or property to which the attribute is applied. Если атрибут — любой элемент внутри члена (например, параметр, возвращаемое значение или параметр универсального типа), то результат — имя члена, который связан с этим элементом.If the attribute is any element within a member (such as a parameter, a return value, or a generic type parameter), this result is the name of the member that's associated with that element.
Нет содержащего члена (например, уровень сборки или атрибуты, примененные к типам)No containing member (for example, assembly-level or attributes that are applied to types) Значение необязательного параметра по умолчанию.The default value of the optional parameter.

См. такжеSee also