2014-11-04 3 views
6

Я использую CsvHelper, чтобы сгенерировать файл csv на основе List, но я хотел бы избежать написания одного из значений. В соответствии с documentation я использовал CsvClassMap, чтобы указать поле, которое я хочу игнорировать. Однако значение все еще записывается в файл.CsvHelper игнорировать не работает

Вот мой класс:

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?

ответ

9

карта класс должен быть registered во время выполнения для того, чтобы CsvHelper знать, чтобы использовать его:

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

Также обратите внимание, что в текущей версии, вы don't need to explicitly ignore fields в классе карты (хотя это изменится в будущее):

Игнорировать

в настоящее время это не используется. Отображение отображает только свойства, которые вы указали. В будущем будет возможность автоматически отображать карту на карте классов, и любые сопоставления, явно указанные, будут переопределять автоматически отображаемые. Когда это произойдет, игнорирование будет использовано для игнорирования свойства, которое было автоматически сопоставлено.

Имея это в виду, вы также могли бы упростить карту класса, как так:

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"); 
    } 
} 
+0

Не знаю, почему это было вниз проголосовали. Я узнал что-то полезное здесь. Что-то не так с ответом? – jsuddsjr

+0

Я думаю, это потому, что он ответил на свой вопрос сразу после публикации его? – Benedict

+2

«Не просто ответить на ваш вопрос и ответить на него, его явно поощряют»: http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own -вопросов/ –

Смежные вопросы