CsvHelper忽略不起作用。

18
我正在使用 CsvHelper 基于一个List生成csv文件,但我想避免写入其中的一个值。根据文档,我使用了CsvClassMap来指定要忽略的字段。然而,该值仍然被写入文件。
这是我的类:
public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
}

这是我的 CsvClassMap

public sealed class PersonClassMap : CsvClassMap<Person>
{
    public PersonClassMap()
    {
        Map(m => m.Id).Index(0).Name("Id");
        Map(m => m.FirstName).Index(1).Name("First Name");
        Map(m => m.LastName).Index(2).Name("Last Name");

        Map(m => m.MiddleName).Ignore();
    }
}

这是我用来生成输出的代码:

var persons = new List<Person>
{
    new Person {Id = 1, FirstName = "Randall", MiddleName = "Michael", LastName = "Perry"},
    new Person {Id = 2, FirstName = "Marigold", MiddleName = "Joanne", LastName = "Mercibar"},
    new Person {Id = 3, FirstName = "Sven", MiddleName = "Ergenfein", LastName = "Olafsson"}
};

using (var csvWriter = new CsvWriter(textWriter))
{
    csvWriter.WriteRecords(persons);
    textWriter.Flush();
}

我的输出如下:

Id,FirstName,MiddleName,LastName
1,Randall,Michael,Perry
2,Marigold,Joanne,Mercibar
3,Sven,Ergenfein,Olafsson

我该怎么做才能让它停止写入MiddleName

2个回答

23

为了让 CsvHelper 知道使用它,类映射必须在运行时注册。

using (var csvWriter = new CsvWriter(textWriter))
{
    csvWriter.Configuration.RegisterClassMap<PersonClassMap>();
    csvWriter.WriteRecords(persons);
    textWriter.Flush();
}

需要注意的是,在当前版本中,您不需要在类映射中显式忽略字段(虽然这将来会改变):

忽略

目前此选项没有被使用。映射只会映射您指定的属性。将来会有一个选项在类映射中自动进行映射,任何显式声明的映射都将覆盖自动映射的映射。当这发生时,"忽略"将用于忽略已自动映射的属性。

有了这个想法,您也可以像这样简化您的类映射:

public sealed class PersonClassMap : CsvClassMap<Person>
{
    public PersonClassMap()
    {
        Map(m => m.Id).Index(0).Name("Id");
        Map(m => m.FirstName).Index(1).Name("First Name");
        Map(m => m.LastName).Index(2).Name("Last Name");
    }
}

1
不确定为什么这个被踩了。我在这里学到了有用的东西。回答有问题吗? - jsuddsjr
我猜是因为他在发布问题后立即回答了自己的问题吧? - Benedict
8
"不仅可以问自己的问题并回答,而且还特别鼓励这样做。":http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ - Ryan Kohn
1
在一些版本之前,CsvClassMap<T> 被重命名为 ClassMap<T> - Steve Friedl

16

您可以使用这个标签:[Ignore]

例如:

//Ignored value
[Ignore]
double value0 = 0;

//Serializable value
[Name("value 1")]
double value1 = 0;

1
比Ryan Kohn的答案容易得多和简单。 - VDWWD
3
必须添加 using 语句 CsvHelper.Configuration.Attributes; - benbants

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接