是否可以使用反射获取当前正在执行的类名?

时间:2010-11-29 17:26:54

标签: c# reflection

我正在编写一个日志记录类,我希望能够获得调用Helper.Log(string message)的类的名称。

这是否可以使用反射和c#?

2 个答案:

答案 0 :(得分:3)

是的,这很容易。

Helper.Log("[" + this.GetType().Name + "]: " + message);

答案 1 :(得分:1)

请注意,如果您的记录器类实际上是日志框架(如log4net或NLog)的包装器,则可以配置日志记录框架以获取调用类/方法。为了使其正常工作,您必须正确地包装日志框架。对于NLog和log4net,正确换行(以保留呼叫站点信息)通常涉及使用“Log”方法(而不是Error,Warn,Info等变体)并将“logger type”作为第一个参数传递。 “记录器类型”是包装记录框架记录器的记录器的类型。

这是一种包装NLog(taken from here)的方法:

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