FieldNotInFile
在我的映射文件中使用该属性时,我遇到了看似意外的行为。请参阅下面我配置的简略示例。
标题记录的映射是单独定义的,以保持 MasterDetail 引擎的选项打开:
public class HeaderMapping
{
public string ID;
public DateTime RptDateFrom;
public DateTime RptDateTo;
public DateTime GenerationDate;
....
}
我想将从标题中检索到的值组合到最终记录结果中,以便使用FieldNotInFile
稍后添加的属性来指定它们。
public class RecordMapping
{
// Values not in source
[FieldNotInFile()]
public string ID;
[FieldNotInFile()]
public DateTime RptDateFrom;
[FieldNotInFile()]
public DateTime RptDateTo;
[FieldNotInFile()]
public DateTime GenerationDate;
// Start values from source
public string RowPrefix;
public string Field1;
public string Field2;
public string Field3;
....
}
在引擎执行中,我定义了两个实例。第一个捕获单个标头记录并解析其值。该AfterReadRecord
事件用于在第一行之后停止引擎。
static void Main(string[] args)
{
// Extract the header
FileHelperEngine<HeaderMapping> headerEngine = new FileHelperEngine<HeaderMapping>();
headerEngine.AfterReadRecord +=
new FileHelpers.Events.AfterReadHandler<HeaderMapping>(AfterHeaderRead);
HeaderMapping[] headerRecord = headerEngine.ReadFile(source.FullName);
// Capture Values
companyId = headerRecord[0].ID;
rptDateFrom = headerRecord[0].RptDateFrom;
rptDateTo = headerRecord[0].RptDateTo;
generationDate = headerRecord[0].GenerationDate;
....
接下来创建记录引擎。该BeforeReadRecord
事件用于将先前捕获的值插入到RecordMapping
withFieldNotInFile
属性中表示的占位符中。
....
// Extract the Records
FileHelperEngine<RecordMapping> recordEngine = new FileHelperEngine<RecordMapping>();
recordEngine.BeforeReadRecord +=
new FileHelpers.Events.BeforeReadHandler<RecordMapping>(BeforeThisRecord);
DataTable outputTable = recordEngine.ReadFileAsDT(source.FullName);
}
....
private static void BeforeThisRecord(EngineBase engine, BeforeReadEventArgs<RecordMapping> e)
{
e.Record.ID = companyId;
e.Record.RptDateFrom = rptDateFrom;
e.Record.RptDateTo = rptDateTo;
e.Record.GenerationDate = generationDate;
}
outputTable 结果与预期不符。标记为的字段FieldNotInFile
从 DataTable 结果中完全省略。调试过程时,该BeforeThisRecord
方法正确执行并分配适当的值,但这不会反映在输出中。DataTable 列输出为 RowPrefix、Field1、Field2 等,而不是 ID、RptDateFrom、RptDateTo、GenerationDate、RowPrefix 等。
奇怪的是,当我使用替代方法时..
List <RecordMapping> recordList = recordEngine.ReadFileAsList(source.FullName);
列表项包含RecordMapping
具有所有正确值的对象。似乎FieldNotInFile
属性的 DataTable 转换是罪魁祸首。我做错了吗?这是一个错误吗?