Filehelpers NullReferenceException при попытке записать нулевое десятичное значение

При использовании библиотеки FileHelpers я получаю исключение NullReferenceException при попытке написать файл .csv.

Я сузил проблему. Всякий раз, когда у меня есть нулевое десятичное число? он выдает это исключение. Он отлично работает при чтении, но не при записи.

Я включил пример, который показывает ту же проблему, что и мое приложение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication11
{
   class Program
   {
      static void Main(string[] args) {
         rec record = new rec { id = 1, mydecimal = null };
         List<rec> records = new List<rec> { record };

         FileHelpers.FileHelperEngine<rec> engine = new FileHelpers.FileHelperEngine<rec>();

         Console.WriteLine(engine.WriteString(records));

      }
   }

   [FileHelpers.DelimitedRecord(",")]
   public class rec
   {
      public int id;
      public decimal? mydecimal;

   }
}

person Erick    schedule 08.11.2011    source источник
comment
Nullable‹decimal› не должно быть проблемой, если вы не используете древнюю версию FileHelpers. filehelpers.com/example_nullable.html   -  person Jonas Elfström    schedule 08.11.2011
comment
Я использую версию 2.0.0.0 и исходит от nuget. Кажется, это последняя версия. Приведенный выше код выдает исключение. Я разместил полный проект на github, но это то, что вы видите здесь, завернутое в решение/проект vs2010: github.com/estubbs/Stack-overflow-fh-questions   -  person Erick    schedule 08.11.2011


Ответы (2)


Вы можете использовать пользовательский конвертер.

public class NullableDecimalConverter : FileHelpers.ConverterBase
{
    public override object StringToField(string from)
    {
        return from;
    }

    public override string FieldToString(object fieldValue)
    {
        if (fieldValue == null)
            return String.Empty;
        return fieldValue.ToString();
    }
}

Вам нужно изменить класс записи, чтобы добавить атрибут [FieldConverter()] к любому полю decimal?.

[FileHelpers.DelimitedRecord(",")]
public class rec
{
    public int id;

    [FileHelpers.FieldConverter(typeof(NullableDecimalConverter))]
    public decimal? mydecimal;

}
person shamp00    schedule 15.12.2011

Ненавижу отвечать на свой вопрос, но FileHelpers 2.9.9 решает эту проблему. Раньше он был доступен на официальном сайте (с пометкой бета), но сейчас не могу его найти.

Однако он доступен в NuGet в пакете FileHelpers-stable.

person Erick    schedule 13.07.2012