2016-09-13 3 views
0

Моя программа будет иметь создавать файлы в виде трех способов, как показано нижеFileHelpers разное количество полей

1 case: all fields and create file 
2 case: without Variation2 and Merkmalname2 
3 case: without Variation2 and Merkmalname2 and Variation3 and Merkmalname3 

код класса:

Imports FileHelpers 

<DelimitedRecord(",")> 
Public Class CSV 
    <FieldQuoted(QuoteMode.AlwaysQuoted)> 
    Public Artikelnummer As String 

    <FieldQuoted(QuoteMode.AlwaysQuoted)> 
    Public Variation1 As String 

    <FieldQuoted(QuoteMode.AlwaysQuoted), FieldOptional()> 
    Public Variation2 As String 

    <FieldQuoted(QuoteMode.AlwaysQuoted), FieldOptional()> 
    Public Variation3 As String 

    <FieldQuoted(QuoteMode.AlwaysQuoted)> 
    Public Barcode As String 

    <FieldQuoted(QuoteMode.AlwaysQuoted)> 
    Public Merkmalname1 As String 

    <FieldQuoted(QuoteMode.AlwaysQuoted), FieldOptional()> 
    Public Merkmalname2 As String 

    <FieldQuoted(QuoteMode.AlwaysQuoted), FieldOptional()> 
    Public Merkmalname3 As String 

End Class 

поэтому я отмечены эти поля как необязательные. Однако я получаю сообщение об ошибке.

первый случай:

Dim WithAll = New CSV() With { 
      .Artikelnummer = "my artikelname 2", 
      .Variation1 = "my variation 2", 
.Variation2 = "my variation 2", 
.Variation3 = "my variation 2", 
      .Barcode = "barcode 2", 
      .Merkmalname1 = "blabla 2", 
.Merkmalname2 = "blabla 2", 
.Merkmalname3 = "blabla 2"} 

     engine.HeaderText = engine.GetFileHeader 
     engine.WriteFile("Output.txt", WithAll) 

второй случай:

Dim WithTwo = New CSV() With { 
      .Artikelnummer = "my artikelname 2", 
      .Variation1 = "my variation 2", 
.Variation2 = "my variation 2", 
      .Barcode = "barcode 2", 
      .Merkmalname1 = "blabla 2", 
.Merkmalname2 = "blabla 2"} 

     engine.HeaderText = engine.GetFileHeader 
     engine.WriteFile("Output.txt", WithTwo) 

третий случай:

Dim WithOne = New CSV() With { 
      .Artikelnummer = "my artikelname 2", 
      .Variation1 = "my variation 2", 
      .Barcode = "barcode 2", 
      .Merkmalname1 = "blabla 2"} 

     engine.HeaderText = engine.GetFileHeader 
     engine.WriteFile("Output.txt", WithOne) 

Ошибка я получаю для всех случаев:

An unhandled exception of type 'FileHelpers.BadUsageException' occurred in FileHelpers.dll 

Additional information: The field: VariationswertX must be marked as optional because the previous field is marked as optional. (Try adding [FieldOptional] to VariationswertX) 

ответ

0

Атрибут FieldOptional применяется только для импорта. Поле будет включено при экспорте.

В качестве обходного пути вы можете использовать событие AfterWrite, чтобы удалить последний разделитель. Что-то вроде этого:

[DelimitedRecord(",")] 
class Product : INotifyWrite 
{ 
    [FieldQuoted(QuoteMode.AlwaysQuoted)] 
    public string Name; 
    [FieldQuoted(QuoteMode.AlwaysQuoted)] 
    public string Description; 
    [FieldOptional] 
    public string Size; 

    public void BeforeWrite(BeforeWriteEventArgs e) 
    { 
     // prevent output of [FieldOptional] Size field 
     Size = null; 
    } 

    public void AfterWrite(AfterWriteEventArgs e) 
    { 
     // remove last "delimiter" 
     e.RecordLine = e.RecordLine.Remove(e.RecordLine.Length - 1, 1); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var engine = new FileHelperEngine<Product>(); 
     var products = new Product[] { new Product() { Name = "Product", Description = "Details", Size = "Large"} }; 
     var productRecords = engine.WriteString(products); 
     try 
     { 
      // Make sure Size field is not part of the output 
      Assert.AreEqual(@"""Product"",""Details""" + Environment.NewLine, productRecords); 
      Console.WriteLine("All tests pass"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("An error occurred"); 
      Console.WriteLine(ex); 
     } 

     Console.ReadKey(); 
    } 
} 
Смежные вопросы