【问题标题】:Deferred trace message formatting via Func<string>?通过 Func<string> 延迟跟踪消息格式?
【发布时间】:2011-01-03 11:00:37
【问题描述】:

在启用跟踪编译的应用程序中,跟踪语句将始终执行,即使侦听器配置为丢弃它们。有时,格式化跟踪消息需要做大量工作,例如:

Trace.Write(IAmExpensiveToRender.ToString() + " requested the following " + string.Join(",", itemList)));

最好将格式化推迟到跟踪消息被过滤之后,实现这一点的一种方法是将Func&lt;string&gt;而不是string传递给跟踪方法:

    Trace.Write((Func<string>)(() => IAmExpensiveToRender.ToString() + " requested the following " + string.Join(",", itemList)));

System.Diagnostics.Trace 类支持此功能(因为它具有接受对象的包罗万象的重载),但需要自定义侦听器通过调用 Func 来获取实际字符串。

我无法想象还没有人尝试过这个。是否有任何现有的跟踪库和/或侦听器可以利用这一点? (我一个都找不到)

[更新]经过一番反思,似乎接受格式化字​​符串 + 参数列表的 Trace 重载已经支持延迟格式化。他们将字符串 + args 传递给 TraceListener,然后仅当消息实际写入文件时才进行格式化。

【问题讨论】:

    标签: c# trace


    【解决方案1】:

    我不知道支持此功能的现有跟踪格式化程序。

    但是由于我们知道 Trace.Write 的 object 重载将打印 .ToString() 的值;我们可以利用这一点:

    class DeferredTraceExecutor 
    {
        private readonly Func<string> traceMessage;
    
        public DeferredTraceExecutor(Func<string> traceMessage) 
        {
            this.traceMessage = traceMessage;
        }
    
        public override string ToString() 
        {
            return traceMessage();
        }
    }
    

    然后在您的跟踪消息中使用:

    Trace.Write(new DeferredTraceExecutor(() => IAmExpensiveToRender.Tostring());
    

    【讨论】:

    • 嗯...有可能。 Trace.Write 语法很丑,但可以通过一些扩展方法来改进。谢谢!
    • @Addys,确切地说;随意改进语法,这只是我头脑中的一个想法;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多