В настоящее время я пишу сглаженный объект DTO в CSV, используя csvwriter csvhelper. Есть ли способ условно игнорировать определенные поля, если они еще не были инициализированы или имеют значение null в картографе? Я вижу, что флаг игнорирования принимает логическое значение, но как мне получить доступ к рассматриваемому полю, чтобы проверить это.
Извиняюсь, если на этот вопрос был дан ответ в другом месте, но я искал как проблемы с github, так и stackoverflow.
Меня немного смутил вопрос, потому что Игнор - это все или ничего. Вы не можете игнорировать поле построчно. Вы либо включаете поле, либо нет. Вы можете игнорировать поле, если, скажем, все записи имеют нулевое или пустое значение для определенной переменной-члена.
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; }
}
Ответ для меня заключался в том, чтобы передать набор полей/столбцов, которые нужно игнорировать, в картограф. Это включало в себя проверку сбора данных на наличие пустых значений во всех строках, и если это так, то я могу полностью опустить этот столбец. Затем я передаю эту коллекцию 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));
}