编写时在 CsvHelper 中转换或过滤成员

Posted

技术标签:

【中文标题】编写时在 CsvHelper 中转换或过滤成员【英文标题】:Convert or filter members in CsvHelper when writing 【发布时间】:2021-10-28 10:50:21 【问题描述】:

想象一下我有这样的课程

public class DataGroup 

    public string DataA  get; set; 
    public string DataB  get; set; 
    public bool Updated  get; set; 

Updated == false时需要为DataADataB写一个空字符串或"N/A"Updated == true时为实际值;

这可以通过 CsvHelper 实现吗?

类型转换似乎不起作用,因为它只访问最终成员,因此无法读取 Updated 的值。

MapMember 类有一个 Conversion 方法,但它似乎只适用于阅读。

【问题讨论】:

【参考方案1】:

您可以使用Convert 方法。这种方法可能有点混乱,因为它可以是ConvertFromStringConvertToString,具体取决于您的使用方式。

ConvertFromString 使用RowCsvReader

Map(m => m.DataA).Convert(m => m.Row.GetField("DataA") + m.Row.GetField("Updated"));

ConvertToString 使用ValueCsvWriter

Map(m => m.DataA).Convert(m => m.Value.DataA + m.Value.Updated);

你想要ConvertToString,所以你的ClassMap可能是这样的。

public class DataGroupMap : ClassMap<DataGroup>

    public DataGroupMap()
    
        Map(m => m.DataA).Convert(m =>
        
            if (m.Value.Updated)  return m.Value.DataA; 
            return "N/A";
        );
        Map(m => m.DataB).Convert(m =>
        
            if (m.Value.Updated)  return m.Value.DataB; 
            return "N/A";
        );
        Map(m => m.Updated);
    

【讨论】:

非常感谢大卫。这当然有效,而且是一个可能的答案。 @wjax 请考虑支持或接受您认为有帮助的答案。【参考方案2】:
if(Updated == false)

    DataA = "N/A";
    DataB = "N/A";

else

     DataA = "Actual Information";
     DataB = "Actual Information";

您可以将类型设置为空,而不是“N/A”

【讨论】:

这个想法是不必修改数据类。所以修改访问器不是一种选择

以上是关于编写时在 CsvHelper 中转换或过滤成员的主要内容,如果未能解决你的问题,请参考以下文章

使用“接口”时在类中没有声明成员函数

运行时在构造函数中初始化向量类成员——C++

通过过滤度量值在 MDX 中定义计算成员

在 Django 中,如何优雅地将查询集过滤器添加到大型组或对象的所有成员?

Laravel:更新数据时在 null 上调用成员函数 getClientOriginalName()

c ++设计:从基类转换为派生类,没有额外的数据成员