Información del llamador (C#)Caller Information (C#)

Mediante los atributos de información del llamador, se puede obtener información sobre el llamador de un método.By using Caller Info attributes, you can obtain information about the caller to a method. Puede obtener la ruta de acceso al código fuente, el número de línea en el código fuente y el nombre de miembro del llamador.You can obtain file path of the source code, the line number in the source code, and the member name of the caller. Esta información resulta útil para el seguimiento y la depuración, así como para crear herramientas de diagnóstico.This information is helpful for tracing, debugging, and creating diagnostic tools.

Para obtener esta información, se usan los atributos que se aplican a los parámetros opcionales, que tienen valores predeterminados.To obtain this information, you use attributes that are applied to optional parameters, each of which has a default value. En la tabla siguiente se enumeran los atributos de información del llamador que se definen en el espacio de nombres System.Runtime.CompilerServices:The following table lists the Caller Info attributes that are defined in the System.Runtime.CompilerServices namespace:

AtributoAttribute DescripciónDescription TipoType
CallerFilePathAttribute Ruta de acceso completa del archivo de código fuente que contiene el llamador.Full path of the source file that contains the caller. Esta es la ruta de acceso en tiempo de compilación.This is the file path at compile time. String
CallerLineNumberAttribute Número de línea en el archivo de código fuente en el que se llama al método.Line number in the source file at which the method is called. Integer
CallerMemberNameAttribute Método o nombre de propiedad del llamador.Method or property name of the caller. Vea Nombres de miembro más adelante en este tema.See Member Names later in this topic. String

EjemploExample

En el ejemplo siguiente se muestra cómo utilizar atributos de información del llamador.The following example shows how to use Caller Info attributes. En cada llamada al método TraceMessage, la información del llamador se sustituye como argumentos para los parámetros opcionales.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

ComentariosRemarks

Se debe especificar un valor predeterminado explícito para cada parámetro opcional.You must specify an explicit default value for each optional parameter. No se pueden aplicar atributos de información del llamador para los parámetros que no se especifican como opcionales.You can't apply Caller Info attributes to parameters that aren't specified as optional.

Los atributos de información del llamador no crean un parámetro opcional,The Caller Info attributes don't make a parameter optional. sino que influyen en el valor predeterminado que se pasa cuando se omite el argumento.Instead, they affect the default value that's passed in when the argument is omitted.

Los valores de información del llamador se emiten como literales en el lenguaje intermedio (IL) en tiempo de compilación.Caller Info values are emitted as literals into the Intermediate Language (IL) at compile time. A diferencia de los resultados de la propiedad StackTrace para las excepciones, los resultados no se ven afectados por confusión.Unlike the results of the StackTrace property for exceptions, the results aren't affected by obfuscation.

Puede proporcionar explícitamente los argumentos opcionales para controlar la información del llamador u ocultarla.You can explicitly supply the optional arguments to control the caller information or to hide caller information.

Nombres de miembroMember names

Se puede utilizar el atributo CallerMemberName para evitar especificar el nombre de miembro como un argumento String para el método llamado.You can use the CallerMemberName attribute to avoid specifying the member name as a String argument to the called method. Mediante esta técnica, se evita el problema de que la refactorización de cambio de nombre no cambie los valores String.By using this technique, you avoid the problem that Rename Refactoring doesn't change the String values. Esta ventaja es especialmente útil para las siguientes tareas:This benefit is especially useful for the following tasks:

  • Usar el seguimiento y las rutinas de diagnóstico.Using tracing and diagnostic routines.

  • Implementar la interfaz INotifyPropertyChanged al enlazar datos.Implementing the INotifyPropertyChanged interface when binding data. Esta interfaz permite que la propiedad de un objeto notifique a un control enlazado que la propiedad ha cambiado, de forma que el control pueda mostrar información actualizada.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. Sin el atributo CallerMemberName, se debe especificar el nombre de propiedad como un literal.Without the CallerMemberName attribute, you must specify the property name as a literal.

En el gráfico siguiente se muestran los nombres de miembro que se devuelven cuando se utiliza el atributo CallerMemberName.The following chart shows the member names that are returned when you use the CallerMemberName attribute.

Las llamadas se producen enCalls occurs within Resultado del nombre de miembroMember name result
Método, propiedad o eventoMethod, property, or event Nombre del método, propiedad o evento en el que se originó la llamada.The name of the method, property, or event from which the call originated.
ConstructorConstructor Cadena ".ctor"The string ".ctor"
Constructor estáticoStatic constructor Cadena ".cctor"The string ".cctor"
DestructorDestructor Cadena "Finalize"The string "Finalize"
Conversiones u operadores definidos por el usuarioUser-defined operators or conversions Nombre generado para el miembro, por ejemplo, "op_Addition".The generated name for the member, for example, "op_Addition".
Constructor de atributoAttribute constructor Nombre del método o la propiedad a la que se aplica el atributo.The name of the method or property to which the attribute is applied. Si el atributo es cualquier elemento dentro de un miembro (como un parámetro, un valor devuelto o un parámetro de tipo genérico), el resultado es el nombre del miembro asociado a este elemento.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.
Ningún miembro contenedor (por ejemplo, nivel de ensamblado o atributos que se aplican a tipos)No containing member (for example, assembly-level or attributes that are applied to types) El valor predeterminado del parámetro opcional.The default value of the optional parameter.

Vea tambiénSee also