16 September 2013 .NET 4.5, logging Robert Muehsig

Debugging und Logging Code strotzt meist vor Funktionsnamen und co. – nur damit man am Ende im Log wieder die passende Stelle im Code findet. Natürlich gibt es noch weitere Gründe herauszufinden wer welchen Code aufgerufen hat. Das Interface INotifyPropertyChanged ist auch solch ein Beispiel. Hier wird der Name des Properties benötigt.

Dies kann man natürlich statisch lösen – allerdings geht dies beim Refactoring meist schief. Mit .NET 4.5 kommt eine nette Hilfe dazu. Vermutlich kennen es schon einige – aber ich bin erst vor kurzem drüber gestolpert.

Caller Information

In .NET 4.5 ist die Möglichkeit hinzugekommen über 3 Attribute Parameter dekorieren zu können. Diese Parameter werden während des Kompilierens mit den “Aufruf”-Informationen befüllt.

CallerMemberName: Gibt den Namen der aufrufenden Methode oder des Properties wieder.
CallerFilePath: Gibt den vollen Dateipfad (der beim Kompilieren genutzt wurde) wieder.
CallerLineNumber: Die Zeilennummer des aufrufenden Codes.

Die Attribute befinden sich alle im System.Runtime.CompilerServices Namespace.

Beispiel

   1: class Program
   2:     {
   3:         static void Main(string[] args)
   4:         {
   5:             Log("Hello World...");
   6:             Console.ReadLine();
   7:         }
   8:  
   9:         public static void Log(string text, [CallerMemberName] string callerMemberName = "",
  10:                                             [CallerFilePath] string callerPath = "", 
  11:                                             [CallerLineNumber] int callerLineNumber = 0)
  12:         {
  13:             Console.WriteLine("Invoked with: " + text);
  14:             Console.WriteLine("Caller {0} from File {1} (Ln: {2})", callerMemberName, callerPath, callerLineNumber);
  15:         }
  16:     }

Wenn man über ILSpy den Code anschaut, dann findet man auch die konkreten Werte wieder:

   1: internal class Program
   2:     {
   3:         private static void Main(string[] args)
   4:         {
   5:             Program.Log("Hello World...", "Main", "c:\\Users\\Robert\\Documents\\Visual Studio 2013\\Projects\\CallerInformationDemo\\CallerInformationDemo\\Program.cs", 14);
   6:             Console.ReadLine();
   7:         }
   8:         public static void Log(string text, [CallerMemberName] string callerMemberName = "", [CallerFilePath] string callerPath = "", [CallerLineNumber] int callerLineNumber = 0)
   9:         {
  10:             Console.WriteLine("Invoked with: " + text);
  11:             Console.WriteLine("Caller {0} from File {1} (Ln: {2})", callerMemberName, callerPath, callerLineNumber);
  12:         }
  13:     }

 

INotifyPropertyChanged

Hier ist eine Implementierung für das INotifyPropertyChanged Beispiel.

Weitere Informationen gibt es auch hier in dem Blogpost.

Demo-Code auf GitHub

Die Demo-Anwendung ist ebenfalls auf GitHub verfügbar.


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!