鉴于 FileHelpers 的当前状态,您确实必须将该字段定义为字符串并尝试对其进行自己的验证。
我研究了几种不同的方法来解决这个问题——首先,我尝试使用属性而不是字段来设置记录。可以想象,这可以让您创建一个 String 属性并验证 Set 上的输入。事实证明这很困难,因为:
- 属性仅设置为目标字段(如果您想修改 FileHelpers 代码,这很容易修复。
- 必须使用 [FieldNotInFile] 属性标记属性的私有字段(烦人)。
- RecordInfo.CreateCoreFields() 方法中不处理属性。这个需要修复一些,因为您确实必须以正确的顺序创建属性和字段的合并列表。这就是我停止研究这种方法的地方。
下一个计划:按原样使用记录定义,并在读取期间进行验证。在引擎上设置事件处理程序:
engine.AfterReadRecord += new Events.AfterReadHandler<CustomersFixedWithNumericId>(engine_AfterReadRecord);
var res = engine.ReadFile(path);
然后在处理程序中处理错误值:
void engine_AfterReadRecord(EngineBase engine, Events.AfterReadEventArgs<CustomersFixedWithNumericId> e)
{
int intVal;
int.TryParse(e.Record.CustomerID, out intVal);
e.Record.CustomerID = intVal.ToString();
}
这些都不是完美的,但我认为第二个相当接近。
附录:这显示了上面带有后期绑定类的技术:
public void TestMethod1()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
Type t = assembly.GetType("FileHelpers.Tests.CustomersFixedWithNumericId");
FileHelperEngine engine = new FileHelperEngine(t);
string path = @"pathtofile\BadCustomersFixedNumericId.txt";
engine.AfterReadRecord += new Events.AfterReadHandler<object>(engine_AfterReadRecord);
var res = engine.ReadFile(path);
}
void engine_AfterReadRecord(EngineBase engine, Events.AfterReadEventArgs<object> e)
{
// validation here
}