如何在c#中重构log4net语句?

cch*_*ion 4 c# logging log4net refactoring

好吧,在阅读了danben在这篇文章中的回答之后,我想我已经确信需要编写这种代码,至少在很多情况下都是如此.我的经理似乎也同意了.

if (log.IsDebugEnabled)
     log.Debug("ZDRCreatorConfig("+rootelem.ToString()+")");
if (log.IsInfoEnabled)
     log.Info("Reading Configuration . . .");
Run Code Online (Sandbox Code Playgroud)

它的问题在于,我看到所有这些if语句放在任何地方只是为了做一个简单的日志语句.

我的问题是,如何在不重现必须评估日志方法参数的性能问题的情况下将它重构为类?

简单地将它作为静态方法放在一个类中也无济于事,因为当您传递Object消息时,它仍然必须评估参数:

public class LogHelper {
     public static Info(ILog log, Object message) {
          if(log.IsInfoEnabled) { log.Info(message); }
     }
}
Run Code Online (Sandbox Code Playgroud)

C#显然不支持强制方法为内联,因此该解决方案不可用.C#不支持MACRO.我们能做什么?!?!

更新:感谢回复,我没有忘记这个; 现在我的名单上只是低位优惠.一旦我陷入困境,我会接受它并给出答案.谢谢.

另一个更新:
嗯......我还没有看好这个,你们两个都应该得到正确答案; 但我向Tanzelax颁发了答案,因为我同意,我认为他们会自动内联.他发布的链接很好地说服了我,我现在不应该过多担心这一点,这也很好.我以后还会看看那些lambda的东西.谢谢您的帮助!

Jon*_*eet 15

一个简单的解决方案是使用lambda表达式有效地将消息生成推迟到需要时(如果需要):

public static class LogHelper {
    public static void Info(this ILog log, Func<Object> messageProvider) {
        if(log.IsInfoEnabled) { log.Info(messageProvider()); }
    }
}
Run Code Online (Sandbox Code Playgroud)

称之为:

log.Info(() => "This is expensive: " + CalculateExpensiveValue());
Run Code Online (Sandbox Code Playgroud)