CsvHelper-如何始终将枚举序列化为值

时间:2019-11-28 14:58:15

标签: c# csvhelper

我正在使用出色的.NET库“ CsvHelper”从我的C#应用​​程序输出CSV。我发现枚举被序列化为其字符串值而不是基础值。我以为自己可以编写自己的TypeConverter来做到这一点,如下所示

public class EnumConverter : ITypeConverter
{
    public object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        if (text == null)
            throw new ArgumentNullException(nameof(text));

        if (memberMapData == null)
            throw new ArgumentNullException(nameof(memberMapData));

        var type = memberMapData.Member.GetType();
        if (!type.IsEnum)
            throw new InvalidOperationException($"Cannot use EnumConverter for non enum type '{type.Name}'");

        var underlyingType = Enum.GetUnderlyingType(type);

        object enumValue;
        try
        {
            enumValue = Convert.ChangeType(text, underlyingType);
        }
        catch (Exception x)
        {
            throw new FormatException($"Invalid '{type.Name}' value '{text}' - cannot convert to {underlyingType.Name}");
        }

        if (!Enum.IsDefined(type, enumValue))
            throw new FormatException($"Invalid '{type.Name}' value '{text}'");

        return Enum.ToObject(type, enumValue);
    }


    public string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        if (value == null)
            throw new ArgumentNullException(nameof(value));

        var type = value.GetType();
        if (!type.IsEnum)
            throw new InvalidOperationException($"Cannot use EnumConverter for non enum type '{type.Name}'");

        var underlyingType = Enum.GetUnderlyingType(value.GetType());

        try
        {
            return Convert.ChangeType(value, underlyingType).ToString();
        }
        catch (Exception x)
        {
            throw new FormatException($"Cannot convert enum '{type.Name}' to {underlyingType.Name}");
        }
    }
}

如果我指定将转换器用作模型的属性,则效果很好

 [CsvHelper.Configuration.Attributes.TypeConverter(typeof(Converters.EnumConverter))]
    public TestEnum Field { get; set; }

如果我按如下所示将其添加到CsvWriter / CsvReader配置的转换器中,那是行不通的

csv.Configuration.TypeConverterCache.RemoveConverter<Enum>();
csv.Configuration.TypeConverterCache.AddConverter<Enum>(new Converters.EnumConverter());

我想这是因为我使用的是通用枚举而不是实际的枚举类型(TestEnum)-但是,我真的不想为要编写的系统中的每个枚举指定此名称。有没有办法让每个枚举都可以使用此功能?

1 个答案:

答案 0 :(得分:1)

您需要指定所需的enum。指定Enum就像指定Object而不是指定的class

csv.Configuration.TypeConverterCache.AddConverter<TestEnum>(new Converters.EnumConverter());

我认为您可以做什么。为此在github上添加功能请求。