2015-06-11 45 views
0

使用FileHelpers庫版本3.0.1。FileHelpers庫 - 是否可以在運行時更改字段的日期格式?

說你定義一個字段從一個CSV文件中像這樣導入:現在

[FieldTrim(TrimMode.Both)] 
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)] 
    [FieldConverter(ConverterKind.Date, "d-MMMM-yyyy")] 
    public DateTime DOB; 

,該CSV場預計將在日期格式「d-MMMM-YYYY」,並在編譯設置時間。我有一個要求在運行時(有時)將此格式更改爲「d-MMMM-yy」。

使用的格式取決於源文件 - 有些文件有2位數字年份,有些文件有4位數字年份。我會在程序啓動時知道使用哪種格式。

FileHelpers可能嗎?我想我可以像添加一個字符串列:

[FieldTrim(TrimMode.Both)] 
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)] 
public string DOBAsString; 

,並獲得FileHelpers將數據讀入這一領域,並將其轉換爲DOB場自己在一個循環。有更清潔的方法嗎?

+0

你可以在運行時更改FieldConverter屬性的值。你可以在這裏看到一個例子http://codinglight.blogspot.in/2008/10/changing-attribute-parameters-at.html –

+0

謝謝,但我不確定這是否會與FileHelpers一起工作,因爲FileHelpers負責創建該字段所在對象的實例。所以似乎沒有能夠獲得對象實例的鉤子(?)。 –

+0

我明白了。如果你找不到用FileHelpers解決這個問題的方法,你仍然可以在運行時改變屬性(即使FileHelpers創建了實例)。您可以將此解決方案作爲最後的手段。 –

回答

1

最簡單的方法是使用的ConverterKind.DateMultiFormat代替ConverterKind.Date

[FieldTrim(TrimMode.Both)] 
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)] 
[FieldConverter(ConverterKind.DateMultiFormat, "d-MMMM-yyyy", "d-MMMM-yy"] 
public DateTime DOB; 

在一般情況下,在運行時指定格式的另一種方法是用ClassBuilder使用runtime classes

FixedClassBuilder cb = new FixedLengthClassBuilder("Customers"); 

cb.AddField("DOB", 8, typeof(DateTime)); 
cb.LastField.Converter.Kind = ConverterKind.Date; 
cb.LastField.Converter.Arg1 = "d-MMMM-yyyy"; // or whatever 
cb.LastField.TrimMode = TrimMode.Both; 
cb.LastField.FieldNullValue = DateTime.Now;   

engine = new FileHelperEngine(cb.CreateRecordClass()); 
相關問題