Gwiazdorrr w komentarzu do poprzedniej notki o log4net przedstawił inny, niewątpliwie sprytny sposób automatyzacji pobierania nazwanego loggera za pomocą extension methods (metod rozszerzających):
namespace Logging
{
public static class LogExtensions
{
public static ILog GetLog(this Object obj)
{
return LogManager.GetLogger(obj.GetType());
}
}
}
public void TestLoggerName()
{
BasicConfigurator.Configure();
ILog log = GetLog();
Assert.That(log.Logger.Name, Is.EqualTo(”Test.LoggingTests”));
}
Jedyny problem z tym kodem to ta linijka, która się nie kompiluje:
ILog log = GetLog();
Error 1 The name 'Extension' does not exist in the current context C:\VS2008\TestLogging\TestLogging\TestClass.cs
Niemniej jednak, dodanie słowa kluczowego “this” wystarcza, żeby kod się skompilował.
Ciekawe, prawda? Co ciekawsze, prawdopobnie przez to ubzdurałem sobie, że nie można wywoływać metod rozszerzających w kontekście klasy, którą rozszerzają. ;-) Oh well, tutaj poprawiony kod, dzięki gwiazdorrr! To tylko jeden z wielu świetnych sposobów na wykorzystanie tego elementu języka C#.
Bardzo polecam wątek na StackOverflow zawierający dziesiątki świetnych extension methods. W przyszłości spróbuję skrobnąć więcej o metodach rozszerzających, których często używam.
namespace Logging
{
public static class LogExtensions
{
public static ILog GetLog(this Object obj)
{
return LogManager.GetLogger(obj.GetType());
}
}
}
public void TestLoggerName()
{
BasicConfigurator.Configure();
ILog log = this.GetLog();
Assert.That(log.Logger.Name, Is.EqualTo(”Test.LoggingTests”));
}
0
komentarzy