2017-02-09 34 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; 
     } 
相關問題