Posts Tagged ‘extension methods’

Automatyczne nazywanie loggerów log4net, sposób drugi

Author: Mateusz Kubiczek (madmatt) | sierpień 5th, 2009

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”));
}