В настоящее время я пишу сплющенный объект DTO в CSV, используя csvwriter csvhelper. Есть ли способ условно игнорировать определенные поля, если они еще не были инициализированы или являются пустыми в маппере? Я вижу, что флаг игнорирования принимает логическое значение, но как мне получить доступ к соответствующему полю, чтобы проверить это?
Приносим извинения, если на этот вопрос был дан ответ в другом месте, но он выполнил поиск как проблем github, так и стека overoverflow.
2 ответа
Ответ для меня заключался в том, чтобы передать коллекцию полей / столбцов, которые будут игнорироваться в маппере. Это потребовало от меня проверки сбора данных на наличие пустых значений во всех строках, если так, то я могу полностью опустить этот столбец. Затем я передаю эту коллекцию requiredFields в маппер следующим образом.
public sealed class ApplicationCsvWriterMap : ClassMap<ApplicationDto>
{
public ApplicationCsvWriterMap(List<string> requiredFields)
{
Map(m => m.Id).Index(1).Name("AppId").Ignore(!requiredFields.Contains("id"));
Map(m => m.Status.Text).Index(2).Name("Status").Ignore(!requiredFields.Contains("status"));
Map(m => m.ApplicationTimestamp).Index(3).Ignore(!requiredFields.Contains("applicationTimestamp"));
Map(m => m.LastModified).Index(4).Ignore(!requiredFields.Contains("lastModified"));
Затем я могу настроить маппер примерно так, передав коллекцию requiredFields примерно так
else if (results.Data is List<Application> applications)
{
csvWriter.Configuration.RegisterClassMap(new ApplicationCsvWriterMap(results.RequiredFields));
csvWriter.WriteRecords(_dtoMapper.MapApplications(applications));
}
Я был немного смущен этим вопросом, потому что игнорировать это все или ничего. Вы не можете игнорировать поле построчно. Вы либо включаете поле, либо нет. Вы можете игнорировать поле, если, скажем, все записи имели нулевое или пустое значение для определенной переменной-члена.
public static void Main(string[] args)
{
var records = new List<Foo> { new Foo { Id = 1, Name = "" }, new Foo { Id = 2 } };
using (var csv = new CsvWriter(Console.Out))
{
var shouldIgnoreName = records.All(foo => string.IsNullOrEmpty(foo.Name));
var classMap = new DefaultClassMap<Foo>();
classMap.AutoMap();
classMap.Map(m => m.Name).Ignore(shouldIgnoreName);
csv.Configuration.RegisterClassMap(classMap);
csv.WriteRecords(records);
}
Console.ReadKey();
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.