развернуто. Приветствуется мнение экспертов.
Каким способом лучше всего преобразовывать данные на входе в объект класса, с точки зрения скорости, архитектурной расширяемости, читаемости?
Необходимо: преобразовать List<IList<object>> в кастомный тип
Есть набор данных, строки, целые числа, перечисления, дата и время, которые представлены в виде строк, но которые нужно будет преобразовать в свойства объекта, так как это делается с использованием десериализации JSON, XML.
! Нужно учитывать, что у даты может быть культура, что число с запятой может быть в формате 12 000,12 и другие особенности преобразования.
Способы которые я вижу.
1. Для каждого типа реализовать кастомный TypeDescriptor класс и потом использовать.
Как по мне интересная реализация, можно в любом месте юзать не указывая явно, так как провайдер знает, что конкретному типу есть уже конвертер.
2. Реализовать интерфейс ISerializable для каждого из типов и класс Сереализатор, наподобие
Продолжение. 2. Реализовать интерфейс ISerializable для каждого из типов и класс Сереализатор, наподобие JsonSerializer Ниче про это не знаю, но мне кажется тоже структуру привносит в проект 3. Написать утилиту со статическим методом и не париться, обрабатывать данные через If else и рефлексией создать объект типа (рис 2.) Не очень нравится, на if else ветвления уходит много строк кода и моя утилита уже разрослась до 600 строк, а я использую только 4 типа На рис. 1 показана схема преобразования для наглядности.
Если есть статьи какие-то интересные на тему преобразования или еще что-то, буду рад почитать
Вспомнилось, на стажировку контура был тип ConcurrentDictionary<string,ConcurrentDictionary<string,ConcurrentDictionary<ConcurrentDictionary<string,string> постоянные флншбеки вложенности
Надо еще больше вложенности....
Я делал что-то подобное Генерировался некий шаблон в котором помимо основных настроек были объекты. Каждый объект имел структуру {тип; объект}. При десериализации из жсона использовался кастомный конвертер для шаблона который знал о всех кастомных конвертерах для каждого известного типа и на основе типа отдавал объект соответствующему конвертеру. Из минусов: - сложно для понимания - в объекте шаблона был список ITemplateItem'ов что требовало доп проверок и кастов Из плюсов: - единый подход парсинга - безопасно - максимально кастомизируемо без лишних танцев. Добавил класс/структуру для нового типа, реализовал конвертер и зарегал его
Я тут ожидаю увидеть какую-то генерическую штуку на рефлекшене.
Обсуждают сегодня