Есть ли способ сделать порядок полей с помощью библиотеки FileHelpers? - PullRequest
7 голосов
/ 12 января 2012

Я скачал FileHelpers из nuget, но я не уверен, что эта функция не существует или у меня нет нужной версии или что.

Я был , оглядываясь и этоКажется, что FileHelpers может иметь атрибут для указания порядка полей.

Я скачал этот однако, когда я искал в nuget, кажется, другая версия

1 Ответ

8 голосов
/ 12 января 2012

Во-первых, атрибут 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 и изменять порядоквместо этого, внутри полей класса.

С другой стороны, если вам нужно указать порядок полей во время выполнения, вы должны создать класс 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[]; 

. Вы можете использовать любую логику, которая вам нравится, чтобы добавить свои поля в необходимыезаказ.

...