我们有一个自定义的TraceListener实现,它只在收到特定对象(LogMessage)时记录。当直接使用Trace.Write(object)
方法时,这一切都很有效。
由于性能原因,我想分离监听器,因此所有不相关的跟踪消息都不会传递给监听器。因此,我创建了一个特定的TraceSource,只附加了这个侦听器。
现在我很难使用TraceSource将自定义日志对象(LogMessage)传递给侦听器。 TraceSource.TraceData(TraceEventType, int, object)
始终调用TraceListener.Write(string)
方法,而不是TraceListener.Write(object)
方法。
有没有办法可以使用TraceSource将自定义对象传递给Listener?
示例代码:
using System.Diagnostics;
namespace Sample
{
public class LogMessage
{
public byte[] Data { get; set; }
//...
}
public class Sample
{
public void Foo()
{
var ts = new TraceSource("Test");
var lm = new LogMessage();
//lm.Data = ...;
//this works: calls the Write(object) method in listener
Trace.Write(lm);
//this doesn't work: calls the Write(string) method in listener
ts.TraceData(TraceEventType.Information, 0, lm);
}
}
public class MyListener : TraceListener
{
public override void Write(string message)
{
//not in use
}
public override void WriteLine(string message)
{
//not in use
}
public sealed override void Write(object o)
{
if (o is LogMessage)
{
//do someting with the LogMessage
}
}
}
}
由于 托马斯
答案 0 :(得分:1)
也许现在回答为时已晚,但无论如何:
通过使用像JustDecompile这样的工具,您可以很容易地看到TraceSource.TraceData使用TraceListener.TraceData方法,该方法本身基本上使用object.ToString()为WriteLine调用WriteLine。
因此,您必须为您的LogMessage类覆盖ToString方法,以便按照您的意愿执行。