我正在使用出色的.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)-但是,我真的不想为要编写的系统中的每个枚举指定此名称。有没有办法让每个枚举都可以使用此功能?
答案 0 :(得分:1)
您需要指定所需的enum
。指定Enum
就像指定Object
而不是指定的class
。
csv.Configuration.TypeConverterCache.AddConverter<TestEnum>(new Converters.EnumConverter());
我认为您可以做什么。为此在github上添加功能请求。