编写时在 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
时需要为DataA
和DataB
写一个空字符串或"N/A"
,Updated == true
时为实际值;
这可以通过 CsvHelper 实现吗?
类型转换似乎不起作用,因为它只访问最终成员,因此无法读取 Updated
的值。
MapMember
类有一个 Conversion
方法,但它似乎只适用于阅读。
【问题讨论】:
【参考方案1】:您可以使用Convert
方法。这种方法可能有点混乱,因为它可以是ConvertFromString
或ConvertToString
,具体取决于您的使用方式。
ConvertFromString 使用Row
和CsvReader
Map(m => m.DataA).Convert(m => m.Row.GetField("DataA") + m.Row.GetField("Updated"));
ConvertToString 使用Value
和CsvWriter
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 中转换或过滤成员的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中,如何优雅地将查询集过滤器添加到大型组或对象的所有成员?