如何在写入记录时让FileHelpers.Net MultiRecordEngine
调用其AfterWriteRecord
和/或BeforeWriteRecord
事件?似乎永远不会调用此事件。最终目标是获取写入文件的实际字符串(行),该字符串通常由FileHelpers.Events.AfterWriteEventArgs
事件中的AfterWriteRecord
提供。
我正在使用FileHelpers.Net版本3.1.5
注意:在下面的代码中,我可以将MultiRecordEngine
更改为FileHelperAsyncEngine
(并将构造函数限制为单个类型),并且可以毫无问题地调用事件。
以下是基本设置:
using (MultiRecordEngine engine = new MultiRecordEngine(
typeof(HeaderRecord),
typeof(RecordSegment),
typeof(TrailerRecord)))
{
engine.AfterWriteRecord += Engine_AfterWriteRecord;
engine.BeforeWriteRecord += Engine_BeforeWriteRecord;
HeaderRecord header = new HeaderRecord();
engine.WriteNext(header);
}
当调用WriteNext
private void Engine_BeforeWriteRecord(EngineBase engine, FileHelpers.Events.BeforeWriteEventArgs<object> e)
{
// not invoked when using MultiRecordEngine
}
private void Engine_AfterWriteRecord(EngineBase engine, FileHelpers.Events.AfterWriteEventArgs<object> e)
{
// not invoked when using MultiRecordEngine
// I want e.RecordLine!
}
我感谢任何见解!
答案 0 :(得分:1)
我会回答我自己的问题,以防它帮助别人。
在查看 MultiRecordEngine 类的FileHelpers.Net源代码时,似乎 WriteNext 不会调用任何事件。
...然而
MultiRecordEngine.WriteStream(TextWriter writer,IEnumerable records)方法会调用事件。在我的例子中,我使用的是基于 TextWriter 的流,因此调用此方法而不是更方便的 WriteNext 方法相当简单。这样做,可以正确调用事件。
如下所示:
TextWriter tw = new StreamWriter(myStream);
...
...
HeaderRecord header = new HeaderRecord();
//engine.WriteNext(header);
engine.WriteStream(tw, new List<HeaderRecord>() { header });
我不确定( WriteNext 未调用事件)的这种行为是设计还是偶然。我个人认为它是一个bug,因为似乎没有限制阻止调用这些事件,没有相反的文档,并且它与其他FileHelper类不一致,如 FileHelperAsyncEngine