Pull to refresh

Преобразование типов значений в .NET

Reading time2 min
Views6.7K

Введение в проблему


Казалось бы, такая простая тема, как преобразование типов значений (value conversion), не достойна целой статьи. В C# есть подходящий оператор "(T)value", есть типы, которые его реализуют, и тему на этом можно считать закрытой. Но за 14 лет существования .NET разработчики BCL и другие программисты придумали еще 4 способа преобразовывать типы значений.



Вот их список:

  1. System.Convert class;
  2. IConvertible interface;
  3. System.ComponentModel.TypeConverter;
  4. 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...).

Ссылки


» Проект на гитхабе
Tags:
Hubs:
+4
Comments9

Articles

Change theme settings