如何在注册CsvHelper类映射时向Map构造函数传入参数
问题描述
我正在用CsvHelper读取CSV文件并生成记录列表。手里有多种CSV文件,它们的数据都要映射到同一个模型的属性,但不同文件的表头、数据排列可能不一样。所以我做了个功能让用户把自己的CSV文件映射到模型属性,在Map类的构造函数里调用方法加载用户创建的自定义映射:
public Map(int accId) { // 加载选中的模型映射 CsvMap csvmap= new(); csvmap.LoadMapForAccount(accId); // 映射细节 Map(m => m.DateTime).Name(csvmap.DateTimeHeader); }
现在遇到的问题是:用csv.Context.RegisterClassMap<Map>();加载映射时,该怎么传入int accId参数?
解决方案
泛型版本的RegisterClassMap<Map>()要求映射类必须有无参构造函数,所以没法直接通过它传构造参数。你可以换用先实例化映射类、再注册实例的方式:
步骤很简单:
- 先创建带
accId参数的Map实例 - 调用非泛型的
RegisterClassMap方法传入这个实例
代码示例:
// 先实例化Map并传入accId var myCustomMap = new Map(accId); // 注册这个实例到CsvContext csv.Context.RegisterClassMap(myCustomMap);
这样就能让Map类的构造函数拿到accId,顺利加载用户自定义的映射配置了。
如果你的场景需要复用映射实例或者有更复杂的依赖,也可以考虑把accId做成Map类的可设置属性,但直接实例化后注册是最直接解决当前问题的方式。
内容的提问来源于stack exchange,提问作者Nico Sz
相关产品推荐
相关产品推荐

