Пару дней назад я опубликовал вопрос о десериализации с перечислениями в F #. Вопрос здесь: Десериализация в F # против C #
Ответ указывает на некоторый код, написанный Исааком Абрахамом, по адресу: https://gist.github.com/isaacabraham/ba679f285bfd15d2f53e
Однако я сталкиваюсь с другимпроблема:
Если объект для десериализации имеет объект типа 'enum option', десериализация не удастся, тогда как он будет работать, если тип просто 'enum'.
Aминимальный пример:
type TestType =
| A = 0
| B = 1
type TestObjectA =
{
test : TestType
}
type TestObjectB =
{
test : TestType option
}
let x = "{\"test\":\"A\"}"
let TestA = Deserialize<TestObjectA> x // will work
let TestB = Deserialize<TestObjectB> x // will fail
и большой код десериализации по адресу: https://pastebin.com/95JZLa6j
Я поместил весь код в скрипку: https://dotnetfiddle.net/0Vc0Rh, но это не может бытьзапускать оттуда, поскольку поддерживаемая ими версия F # не примет ключевое слово 'object'.
Итак, мой вопрос: почему я не могу использовать тип опции для перечисления, но он работает на других типах? В качестве примечания, поскольку я довольно новичок в F #, я не совсем понимаю код Исаака, хотя я потратил некоторое время на его изучение и поиск и устранение неисправностей.
Насколько я понимаю, эта строка:|> Seq.map (fun (value, propertyInfo) -> Convert.ChangeType (value, propertyInfo.PropertyType))
попытается преобразовать тип в перечисление справа, но не в параметр перечисления.
В качестве дополнительного вопроса, есть ли рабочее решение, которое выполняет полную идиоматическую десериализацию с помощью перечислений? (без прохождения нулевых типов)