
Hace unas semanas estuvimos hablando de los atributos englobados en la categoría de "caller information" de .NET: [CallerFilePath]
, [CallerLineNumber]
, [CallerMemberName]
y [CallerArgumentExpression]
. Como vimos, estos atributos permiten que un método o función conozca información sobre el método que lo ha llamado, como el nombre del archivo, el número de línea, el nombre del método o la expresión de argumento.
Sin embargo, ninguna de estas opciones nos permite saber cuál es la clase que contiene el código que ha llamado al método que está actualmente en ejecución, algo que podría venir bien en algunos escenarios. Por ejemplo, recientemente me lo he encontrado revisando un proyecto en el que se utilizaba el sistema de logging NLog, donde encontraba un código como el siguiente para obtener y almacenar de forma estática un logger para la clase actual:
public static class Program
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
public static void DoSomething()
{
try
{
Logger.Info("Hello world");
System.Console.ReadKey();
}
catch (Exception ex)
{
Logger.Error(ex, "Goodbye cruel world");
}
}
}
A la vista de estas líneas, puede parecernos difícil deducir qué hace ese método GetCurrentClassLogger()
por detrás para saber cuál es la clase actual y crearle un logger específico para ella.
En este post, vamos a abrir el capó para ver la "magia" que hace esto posible.

Ya tenemos los enlaces recopilados durante la última semana, la que muchos de los de aquí recordaremos como "la del apagón". Vaya movida, ¿eh? 😄
Interesante la lectura del post de Andrew Lock sobre la creación de un lifetime de inyección de dependencias "pooled".
Curioso el artículo de Raymond Chen sobre por qué Windows 7, durante unos meses, se iniciaba más lento si tenías un fondo de pantalla de color sólido (?)
Y de nuevo destacamos un post de Juan Luis Guerrero, que nos habla de cómo automatizar pruebas unitarias en .NET con GitHub Copilot Agents.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Deserialización y serialización personalizada en .NET con System.Text.Json usando custom converters
José M. Aguilar - ¿Dónde están Application_Start y Application_End en ASP.NET Core?
José M. Aguilar
.NET
- Automate Unit Tests in .NET with GitHub Copilot Agents: Prompt, Iterate, and Win!
Juan Luis Guerrero - Protecting against indirect prompt injection attacks in MCP
Sarah Young - The null check that didn't check for nulls
Oren Eini - HttpClient improvements in .NET 10
Steven Giesel - Creating a 'pooled' dependency injection lifetime
Andrew Lock - How To Implement Retries and Resilience Patterns With Polly and Microsoft Resilience
Anton Martyniuk - Option<T>: Where Null Is Not an Option
Chris Woodruff - General Availability of AWS SDK for .NET V4.0
Norm Johanson - 4 real-life examples of using reflection in C#
Ali Hamza Ansari - AsyncEnumerable in C#: The importance of EnumeratorCancellation attribute
Bart Wullems - Destructuring: Pattern Matching’s Power Move
Chris Woodruff - The Optimisation Lie: Why Your 'Optimised' Code Might Still Be Slow
Darren Horrocks