如何在使用MultiRecordEngine时让FileHelpers.Net调用AfterWrite事件?

时间:2016-07-09 12:07:05

标签: c# filehelpers

如何在写入记录时让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!
    }

我感谢任何见解!

1 个答案:

答案 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