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

#c# #.net #nullreferenceexception #filehelpers

#c# #.net #исключение nullreferenceexception #filehelpers

Вопрос:

При использовании библиотеки 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;

   }
}
  

Комментарии:

1. Значение с нулевым значением<decimal> не должно быть проблемой, если только вы не используете старую версию FileHelpers. filehelpers.com/example_nullable.html

2. Версия, которую я использую, — 2.0.0.0 и взята из nuget. Похоже, это последняя версия. Приведенный выше код выдает исключение. Я опубликовал полный проект на github, но это именно то, что вы видите здесь, завернутое в решение / проект vs2010: github.com/estubbs/Stack-overflow-fh-questions

Ответ №1:

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

 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;

}
  

Ответ №2:

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

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