Один из разработчиков написал именно эту функцию, что мы считаем чрезвычайно полезным.
По сути, он использует отражение для поиска неявного преобразования между двумя типами (для получения дополнительной информации ищите "op_Implicit").
В противном случае он ищет Конструктор типа назначения, который принимает тип источника в качестве параметра и вызывает его.
В противном случае он ищет метод Parse, который может анализировать один тип в другой. Здесь вы найдете такие вещи, как Int32.Parse для преобразования из String в Int или IPAddress.Parse для преобразования из String в IPAddress.
В качестве оптимизации производительности, когда он находит преобразование один раз, он хранит его в словаре [тип, тип] <==> [метод преобразования информации], чтобы последующим вызовам не приходилось проходить расширенный поиск отражения. .
Это прекрасно обрабатывает почти все преобразования типов.