CsvHelper ignore не работает

Я использую CsvHelper для создания файла CSV на основе List, но я бы хотел избежать записи одного из значений. Согласно документации, я использовал 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?


person Ryan Kohn    schedule 04.11.2014    source источник


Ответы (2)


Карта классов должна быть зарегистрирована во время выполнения, чтобы 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");
    }
}
person Ryan Kohn    schedule 04.11.2014
comment
Не уверен, почему это было отклонено. Здесь я узнал кое-что полезное. Что-то не так с ответом? - person jsuddsjr; 24.01.2015
comment
Думаю, это потому, что он ответил на свой вопрос сразу после публикации? - person Benedict; 01.05.2015
comment
Задавать собственный вопрос и отвечать на него - это не просто нормально, это настоятельно рекомендуется: blog.stackoverflow.com/2011/07/ - person Ryan Kohn; 04.05.2015

Вы можете использовать этот ярлык: [Ignore]

например :

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

//Serializable value
[Name("value 1")]
double value1 = 0;
person Bensuperpc    schedule 14.08.2019
comment
Намного проще и проще, чем ответ Райана Кона. - person VDWWD; 09.09.2020
comment
Необходимо добавить оператор using для CsvHelper.Configuration.Attributes; - person benbants; 14.10.2020