CsvHelper Configuration.ShouldQuote - возвращает true только для полей в DTO, которые являются строками - PullRequest
0 голосов
/ 13 июня 2019

Привет, есть объект DTO с множеством свойств разных типов: string, int или bool и т. Д.

Я бы хотел использовать двойные кавычки только для свойств string.

В Configuration.ShouldQuote все значения параметров field были преобразованы в string, поэтому нет никакого способа узнать, был ли исходный тип из DTO string, int или bool.

Есть ли способ найти базовый тип свойства в DTO, чтобы я мог передать true из Configuration.ShouldQuote только для полей, которые изначально были типа string?

public class TestDTO
{
    public string Field1 { get; set; }
    public int Field2 { get; set; }
    public bool Field3 { get; set; }
}
    var rawData = new[]
    {
        new TestDTO { Field1 = "Field1", Field2 = 1, Field3 = true },
        new TestDTO { Field1 = "Field2", Field2 = 10, Field3 = false }
    };
    using (var writer = new StreamWriter("file.csv"))
    {
        using (var csv = new CsvWriter(writer))
        {
            csv.Configuration.ShouldQuote = (field, context) =>
            {
                return field is string; // doesn't work as all fields at this point are strings
            };

            csv.WriteRecords(rawData);
        }
    }

1 Ответ

0 голосов
/ 13 июня 2019

Я не смог найти способ сделать это с ShouldQuote, но использование пользовательского конвертера может быть хорошим решением.

public class QuoteStringConverter : StringConverter
{
    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        var innerQuotes = ((string)value).Replace(row.Configuration.QuoteString, row.Configuration.DoubleQuoteString);
        var quotedValue = row.Configuration.Quote + innerQuotes + row.Configuration.Quote;
        return base.ConvertToString(quotedValue, row, memberMapData);
    }
}

Отключите кавычки и добавьте свой конвертер в TypeConverterCache

var rawData = new[]
{
    new TestDTO { Field1 = "Field1", Field2 = 1, Field3 = true },
    new TestDTO { Field1 = "Field2", Field2 = 10, Field3 = false }
};

using (var writer = new StreamWriter("file.csv"))
using (var csv = new CsvWriter(writer))
{
    csv.Configuration.ShouldQuote = (field, context) => false;
    csv.Configuration.TypeConverterCache.AddConverter<string>(new QuoteStringConverter());

    csv.WriteRecords(rawData);
}        
...