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;
....
}
エンジンの実行では、2 つのインスタンスを定義しました。最初に単一のヘッダー レコードをキャプチャし、その値を解析します。この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;
....
次に、レコード エンジンが作成されます。このイベントは、以前にキャプチャした値をwith属性BeforeReadRecord
で示されたプレースホルダーに挿入するために使用されます。RecordMapping
FieldNotInFile
....
// 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 列は、ID、RptDateFrom、RptDateTo、GenerationDate、RowPrefix などではなく、RowPrefix、Field1、Field2 などとして出力されます。
奇妙なことに、代替方法を使用すると..
List <RecordMapping> recordList = recordEngine.ReadFileAsList(source.FullName);
リスト項目には、RecordMapping
すべて正しい値を持つオブジェクトが含まれています。属性の DataTable 変換が原因のようFieldNotInFile
です。私はこれを間違っていますか?これはバグですか?