使用CSVHelper映射IEnumerable属性

我有一类User ,可以有多个联系号码。 我正在使用CsvHelper为用户生成报告,这将创建用户名和联系人详细信息的CSV文件。 每个联系号码应显示在其自己的列中,联系号码的类型作为列标题。

在下面我有我的ContactNumberUser类,以及一个UserMap类,它应该相应地格式化我的CSV文件:

public class ContactNumber
{
    public string ContactType { get; set; }
    public string Number { get; set; }
}

public class User
{
    public string Name { get; set; }
    public IEnumerable<ContactNumber> ContactNumbers{ get; set;}
}

public sealed class UserMap : CsvClassMap<User>
{
    public UserMap()
    {
        Map(m => m.Name).Name("Username");
        // Incorrect Code
        Map(m => m.ContactNumbers).Name(c => c.ContactType);
    }
}

我应该如何映射ContactNumbers的IEnumerable属性来实现我想要的结果?


它不是CsvHelper的副本 - 在多个列中读入单个列表,因为此问题询问如何从模型转换为CSV而不是其他方式。 我通过创建中间模型来解决这个问题。 因此,首先将原始模型(用户)转换为模型(联系人)之间的模型,然后映射该模型并创建CSV。


我知道这是一个老问题,但我通过将下列属性放在我的DTO(用户类)上创建了另一个解决方案。

public string ConcatenatedUserNumbers
    {
        get
        {
            if (ContactNumbers != null && ContactNumbers.Any())
            {
                return string.Join("; ", ContactNumbers.Select(a => a.Number));
            }
            return string.Empty;
        }
    }

然后我就像这样在CsvHelper中映射到这个属性:

Map(a => a.ConcatenatedUserNumbers).Name("User Numbers");

你显然可以为用户类型做同样的事情,或者有一个方法可以同时获得两者。 数据可能并不完美,但最终用户仍然可以在Excel中使用“过滤器”功能,并且它是人类可读的。 所有这些都不需要多余的映射等。

注意:如果此额外属性仅适用于CSV映射,则也可以创建类CSVUser:User。 您只能将建议的属性放在CSVUser上。

我希望这能帮助别人。

链接地址: http://www.djcxy.com/p/85849.html

上一篇: Mapping an IEnumerable property with CSVHelper

下一篇: Break point is not hitting in javascript file