Можно ли получить текущее имя класса, используя отражение? - PullRequest
2 голосов
/ 29 ноября 2010

Я пишу класс журналирования, и я хотел бы иметь возможность получить имя класса, который имеет вызов Helper.Log(string message).

Возможно ли это с помощью отражения и c #?

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

Да, это довольно просто.

Helper.Log("[" + this.GetType().Name + "]: " + message);
1 голос
/ 29 ноября 2010

Обратите внимание, что если ваш класс логгера действительно является оболочкой для каркаса журналирования (например, log4net или NLog), каркас журналирования может быть настроен для получения вызывающего класса / метода для вас.Чтобы это работало правильно, вы должны правильно обернуть структуру ведения журнала.Для NLog и log4net правильная упаковка (для сохранения информации сайта вызовов) обычно включает использование метода «Log» (а не вариантов Error, Warn, Info и т. Д.) И передачу «типа регистратора» в качестве первого параметра.«Тип регистратора» - это тип вашего регистратора, который оборачивает регистратор инфраструктуры ведения журнала.

Вот один из способов обернуть NLog ( взято отсюда ):

class MyLogger    
{        
  private Logger _logger;        
  public MyLogger(string name)        
  {            
    _logger = LogManager.GetLogger(name);        
  }        
  public void WriteMessage(string message)                 
  {            
    ///            
    /// create log event from the passed message            
    ///             
    LogEventInfo logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, message);            

    // Call the Log() method. It is important to pass typeof(MyLogger) as the      
    // first parameter. If you don't, ${callsite} and other callstack-related             
    // layout renderers will not work properly.            
    //
    _logger.Log(typeof(MyLogger), logEvent);        
  }    
}

А вот как вы могли бы сделать это с log4net:

class MyLogger    
{        
  private ILog _logger;        
  public MyLogger(string name)        
  {            
    _logger = LogManager.GetLogger(name);        
  }        
  public void WriteMessage(string message)                 
  {            
    // Call the Log() method. It is important to pass typeof(MyLogger) as the      
    // first parameter. If you don't, ${callsite} and other callstack-related             
    // formatters will not work properly.            
    //
    _logger.Log(typeof(MyLogger), LogLevel.Info, message);
  }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...