如何让FileHelpers在每条记录上设置行号?

时间:2014-06-30 14:02:18

标签: c#-4.0 filehelpers

是否有机会让MultiRecordEngine为每条记录设置行号? 我阅读了文档,发现Engine有一个LineNumber属性,但我找不到使用它的方法。

我想拥有什么: 即:

[FixedLengthRecord]
    public class Employee
    {
        public int LineNumber; // <-- setup by the engine while reading the file

        [FieldFixedLength(1)]
        public string Type = "2";

        [FieldFixedLength(6)]
        [FieldTrim(TrimMode.Left, "0")]
        public int ID;
     }

或者......我可以依赖Engine.ReadFile创建的集合中的记录索引吗? 即:

  static void Main(string[] args)
    {

        var engine = new MultiRecordEngine(CustomSelector, _types);
        var obj = engine.ReadFile("order.txt");

        // obj.GetValue(100) returns same record found on the 101th line in the file?
    }

1 个答案:

答案 0 :(得分:7)

您可以使用AfterReadRecord事件设置LineNumber属性。

这是一个工作示例

public class Employee
{
    [FieldIgnored]
    public int LineNumber; // <-- setup by the engine while reading the file

    [FieldFixedLength(1)]
    public string Type = "2";

    [FieldFixedLength(6)]
    [FieldTrim(TrimMode.Left, "0")]
    public int ID;
}

class Program
{
    static void Main(string[] args)
    {
        var engine = new FileHelperEngine<Employee>();
        engine.AfterReadRecord += engine_AfterReadRecord;
        Employee[] records = engine.ReadString("2000003" + Environment.NewLine 
                                             + "5000006");

        Employee firstRecord = records[0];
        Assert.AreEqual(1, firstRecord.LineNumber);
        Assert.AreEqual("2", records[0].Type);
        Assert.AreEqual(3, records[0].ID);

        Employee secondRecord = records[1];
        Assert.AreEqual(2, secondRecord.LineNumber);
        Assert.AreEqual("5", records[1].Type);
        Assert.AreEqual(6, records[1].ID);

        Console.Read();
    }

    static void engine_AfterReadRecord(EngineBase engine, AfterReadEventArgs<Employee> e)
    {
        e.Record.LineNumber = engine.LineNumber;
    } 
}