v2.0.0版本AfterRead事件使用报错及正确实现方式咨询
问题解决方法
你遇到的报错本质是混淆了FileHelpers 2.0.0版本两种事件绑定模式的方法签名,且缺少对应命名空间引用,两种实现方式按需选一种即可,类库已经内置了所有需要的委托定义,不需要你额外手动声明。
方式1:仅在映射类中实现逻辑(不需要额外绑定事件)
这种方式就是你最初的实现思路,不需要在引擎初始化时写事件绑定代码,只要让实体类实现INotifyRead接口即可,注意两个关键点:
- 必须引入事件相关命名空间:
using FileHelpers.Events; - 接口要求的
AfterRead方法参数是NotifyReadEventArgs,不是你写的AfterReadEventArgs,同时需要实现接口要求的BeforeRead方法,无相关逻辑留空即可。
正确代码示例:
using FileHelpers; using FileHelpers.Events; // 缺少这个引用就会报事件参数类找不到的错 public sealed class MyClass: INotifyRead { // 这里写你的文件字段映射配置 // 示例: // [FieldOrder(1)] // public string UserName { get; set; } public void AfterRead(EngineBase engine, NotifyReadEventArgs e) { // 读取完成后修改字段值的逻辑写在这里 // 先拿到当前读取到的实体实例 var currentRow = (MyClass)e.Record; // 示例修改逻辑:currentRow.UserName = currentRow.UserName.Trim(); } // 接口强制要求实现的前置方法,不需要就留空 public void BeforeRead(EngineBase engine, BeforeReadEventArgs e) { } }
用这种写法时,引擎读取文件会自动识别实现了INotifyRead接口的实体类,自动调用你写的AfterRead逻辑,不需要额外写事件绑定代码。
方式2:在引擎初始化时绑定外部事件方法(不需要实体类实现接口)
这种就是你在官方文档看到的写法,事件逻辑写在实体类外部,不需要实体类实现INotifyRead接口,这时候才会用到AfterReadEventArgs类型和对应的事件委托。
正确代码示例:
using FileHelpers; using FileHelpers.Events; // 初始化读取引擎 FileHelperEngine engine = new FileHelperEngine(typeof(MyClass)); // 绑定读取完成后的事件处理方法 engine.AfterReadRecord += new AfterReadRecordHandler(OnAfterReadRecord); // 执行文件读取 MyClass[] result = engine.ReadFile("report.txt") as MyClass[]; // 单独定义事件处理逻辑 void OnAfterReadRecord(EngineBase engine, AfterReadEventArgs e) { var currentRow = (MyClass)e.Record; // 这里写字段修改逻辑 }
注意:2.0.0版本中两种方式互斥,选一种实现即可,不要混用两种的方法签名,否则会出现类型找不到、事件不触发的问题。
内容的提问来源于stack exchange,提问作者user19525378
相关产品推荐
相关产品推荐

