2017-02-09 119 views
1

随着CsvHelper,当我想要一个自定义的解析器(例如,我要一个MyBooleanConverter与输入字符串为“F”将是错误的,“T”将是“真”)。但是几乎所有I类必须写映射:CsvHelper组默认的自定义类型转换器

public sealed class MyClassMap : CsvClassMap<MyClass> 
{ 
    public MyClassMap() 
    { 
     Map(m => m.Id).Index(0).TypeConverter<MyBooleanConverter>(); 
    } 
} 

或者

[CsvHelper.TypeConversion.TypeConverter(typeof(MyBooleanConverter))] 
public Boolean MyObjectProperty { get; set; } 

如何设置MyBooleanConverter为默认为每个布尔领域,每类?

回答

1

CsvHelper库公开了一个静态的TypeConverterFactory。您可以简单地删除默认的布尔转换器并添加您的自定义转换器来替换它。

TypeConverterFactory.RemoveConverter<bool>(); 
TypeConverterFactory.AddConverter<bool>(new MyBooleanConverter()); 
0

只需将我的代码片段添加到以下文章,以帮助理解内置到CsvHelper中的类型转换器。我需要按以下格式处理日期“yyyyMMdd”,并且它似乎在不使用.net DateTime Parse错误的情况下来回写入CSV:“字符串未被识别为有效的DateTime。”

using (TextWriter writer = new StreamWriter(csvLocaitonAndName)) 
     { 
      var csvUpdate = new CsvWriter(writer); 
      csvUpdate.Configuration.TypeConverterCache.AddConverter<DateTime?>(new DateConverter("yyyyMMdd")); 
      csvUpdate.Configuration.HasHeaderRecord = false; 
      csvUpdate.WriteRecords(list); 
     } 

public class DateConverter : ITypeConverter 
    { 
     private readonly string _dateFormat; 

     public DateConverter(string dateFormat) 
     { 
      _dateFormat = dateFormat; 
     } 

     public object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData) 
     { 
      if (!string.IsNullOrEmpty(text)) 
      { 
       DateTime dt; 
       DateTime.TryParseExact(text, _dateFormat, 
             CultureInfo.InvariantCulture, 
             DateTimeStyles.None, 
             out dt); 
       if (IsValidSqlDateTime(dt)) 
       { 
        return dt; 
       } 

      } 

      return null; 
     } 
     public string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) 
     { 
      return ObjectToDateString(value, _dateFormat); 
     } 

     public string ObjectToDateString(object o, string dateFormat) 
     { 
      if (o == null) return string.Empty; 

      DateTime dt; 
      if (DateTime.TryParse(o.ToString(), out dt)) 
       return dt.ToString(dateFormat); 
      else 
       return string.Empty; 
     } 
     public bool IsValidSqlDateTime(DateTime? dateTime) 
     { 
      if (dateTime == null) return true; 

      DateTime minValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()); 
      DateTime maxValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString()); 

      if (minValue > dateTime.Value || maxValue < dateTime.Value) 
       return false; 

      return true; 
     } 
相关问题