Введение в проблему
Казалось бы, такая простая тема, как преобразование типов значений (value conversion), не достойна целой статьи. В C# есть подходящий оператор "(T)value", есть типы, которые его реализуют, и тему на этом можно считать закрытой. Но за 14 лет существования .NET разработчики BCL и другие программисты придумали еще 4 способа преобразовывать типы значений.
Вот их список:
- System.Convert class;
- IConvertible interface;
- System.ComponentModel.TypeConverter;
- To, From, Parse, Create methods.
В добавок к этому существуют мета-типы Nullable[T], System.Enum, у которых свои методы преобразования типов значений.
И у всего этого разнообразия методов не было одного удобного API, чтобы преобразовать A→B, не думая о том, каким способом разработчик реализовал возможность этого преобразования.
Решение
Класс TypeConvert в пространстве имен System (да, я знаю, что засорять чужие неймспейсы плохо).
ToType Convert<FromType, ToType>(FromType value, string format, IFormatProvider formatProvider)
Преобразует тип значения из FromType в ToType, опционально используя format и настройки форматирования formatProvider. Если подходящих методов, принимающих настройки форматирования, нет, то будет вызван вариант без учета форматирования.
В README файле есть описание других методов.
Установка
Всё это лежит в одном файле, который можно забрать к себе в проект и в удобном Nuget-пакете:
Install-Package TypeConvert
В нагрузку к Nuget-пакету идут 2 класса:
TypeActivator — создание экземпляров типа через закешированный конструктор,
HexConvert — преобразование байтов/чисел в hexadecimal представление и обратно.
Применение
В проекте ConsoleApp.CommandLine для биндинга передаваемых параметров неизвестного типа к известным параметрам метода.
В приватных проектах для преобразования значений конфигурации полученной из JSON к конкретным сложным типам (Uri, IpAddress, TimeSpan...).
Ссылки
» Проект на гитхабе