Caller Information: Quién me llamó?

Una de las inclusiones que más me ha gustado en el Framework 4.5, es la adición de mecanismos que nos permiten identificar información acerca de quién llamó un método de nuestro código, en tiempo de ejecución.

Así pues, la información que se puede obtener comprende el path del archivo que contiene el código que hizo el llamado, la línea dentro de ese archivo y el nombre del miembro que hizo el llamado. Obviamente toda esta información nos hace mucho sentido cuando hablamos de hacer tracing, depuración y diagnóstico de nuestras aplicaciones.

La forma de obtener esta información es muy sencilla, a través de nuevos atributos que son aplicados como parámetros opcionales con un valor por defecto, dentro del método que queremos inspeccionar. Estos atributos todos se encuentran dentro del namespace System.Runtime.CompilerServices

En la siguiente aplicación de consola de ejemplo, observamos cómo podemos usar estos nuevos atributos para obtener información acerca de quién llamó un método:

 using System;
using System.Runtime.CompilerServices;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteMessage("Mensaje de Trazado");
        }

        private static void WriteMessage(string message,
            [CallerMemberName] string caller="",
            [CallerLineNumber] int lineNumber=0,
            [CallerFilePath] string path = "")
        {
            Console.WriteLine
                ("Mensaje:{0}\nLlamado:{1}\nArchivo:{2}\nLínea {3}",
                message,
                caller,
                path,
                lineNumber);
            Console.ReadLine();
        }
    }
}

El resultado de la ejecución es como sigue:

image

Como se observa, este mecanismo nos ha permitido tener información muy específica de quién llamó determinado método, sin necesidad de alterar la forma en que se llamó el método, pues los parámetros que tienen la información de caller son opcionales, de manera que es transparente para la línea de código que llama al método.

Aunque la información del caller demuestra ser muy útil para la depuración, existe un uso colateral muy interesante sobretodo para el mundo de las apps, donde el binding es muy usado. Esto lo veremos en mi siguiente post.