2012-01-11 157 views
7

我從nuget下載了FileHelpers,但我不確定這個功能是否存在,或者我沒有正確的版本或者什麼。有沒有辦法使用FileHelpers庫進行字段順序?

我一直looking around,似乎FileHelpers可能有一個屬性來指定字段順序。

我下載this one但是當我一直在尋找在的NuGet似乎有another version

+0

根據bitbucket存儲庫中的代碼,它看起來像'FieldOrderAttribute'自03/02/2010以來一直存在,它比您安裝的軟件包早**多**。 – 2012-01-12 00:35:29

+0

此外,更活躍的[SourceForge存儲庫](http://filehelpers.svn.sourceforge.net/viewvc/filehelpers/trunk/FileHelpers/Attributes/FieldOrderAttribute.cs?view=log)顯示該文件自至少2010年3月 – 2012-01-12 00:44:43

+0

那麼nuget的方式已經過時了嗎? – chobo2 2012-01-12 01:41:46

回答

8

首先,FieldOrder屬性不FileHelpers 2.0存在。在FileHelpers 2.9.9中(也可通過NuGet使用),該屬性存在,但如果您爲任何字段指定它,則必須爲所有字段指定它。但是,通常情況下,使用該屬性不是必需的,因爲字段的順序由格式定義。

當使用FileHelpers您提供一個類來描述您的格式,例如,

[DelimitedRecord("|")] 
public class Order 
{ 
    // First field 
    public int OrderID; 

    // Second field 
    public string CustomerID; 

    // Third field 
    [FieldConverter(ConverterKind.Date, "ddMMyyyy")] 
    public DateTime OrderDate;  
} 

這描述了三個字段的格式,用豎線分隔。如果你喜歡,它的格式的說明。一旦定義,你可以用它來導入和導出:

FileHelperEngine engine = new FileHelperEngine(typeof(Order)); 

// To read use: 
Order[] orders = engine.ReadFile("FileIn.txt") as Order[]; 

// To write use: 
engine.WriteFile("FileOut.txt", orders); 

所以,如果你想以不同的順序你的領域,你應該修改你的Order類。

現在,如果你真的想,(用FileHelpers 2.9.9),你可以改變字段的順序如下:

[DelimitedRecord("|")] 
public class Order 
{ 
    // Third field 
    [FieldOrder(3)] 
    public int OrderID; 

    // Second field 
    [FieldOrder(2)] 
    public string CustomerID; 

    // First field 
    [FieldOrder(1)] 
    [FieldConverter(ConverterKind.Date, "ddMMyyyy")] 
    public DateTime OrderDate;  
} 

,但它是清潔,以避免使用FieldOrder屬性和相反,請修改類中字段的順序。

另一方面,如果您需要在運行時指定字段順序,則應使用runtime records構建Order類。您可以使用string

Type orderType = ClassBuilder.ClassFromString(stringContainingOrderClassInCSharp); 

FileHelperEngine engine = new FileHelperEngine(orderType); 
Order[] orders = engine.ReadFile("FileIn.txt") as Order[]; 

或者你可以使用一個ClassBuilder

DelimitedClassBuilder cb = new DelimitedClassBuilder("Order"); 
// First field 
cb.AddField("OrderID", typeof(int)); 
// Second field 
cb.AddField("CustomerID", 8, typeof(string)); 
// Third field 
cb.AddField("OrderDate", typeof(DateTime)); 
cb.LastField.Converter.Kind = ConverterKind.Date; 
cb.LastField.Converter.Arg1 = "ddMMyyyy"; 

engine = new FileHelperEngine(cb.CreateRecordClass()); 
Order[] orders = engine.ReadFile("FileIn.txt") as Order[]; 

你可以用你爲了喜歡的任何邏輯來添加領域所需的順序。

+0

有什麼區別? FileHelpers 2.9.9 - 這個版本似乎缺少這個屬性「FieldTitle」(我鏈接的鏈接之一) – chobo2 2012-01-12 16:54:27

+1

FileHelpers 2.0.0.0在2005年到2007年之間開發,並且穩定並且有很多文檔。更新的版本2.9.9有更少的文檔,我不確定新功能是什麼。 'FieldTitle'已被'engine.HeaderText'屬性取代,您可以按照[鏈接的文章的答案](http://stackoverflow.com/a/4827625/1077279) – shamp00 2012-01-12 17:52:19

+0

中的解釋進行設置,我也在尋找你的代碼,並意識到你不使用屬性。你不能使用屬性嗎?我發現自動屬性不適用於FieldOrder – chobo2 2012-01-12 17:57:07

相關問題