Преобразование
Класс Convert использует методы IConvertible , реализованные в целевом типе.
К сожалению, реализация IConvertible
означает написание большого количества стандартного кода, а Convert.ChangeType вызывает бокс, если целевой тип является структурой.
TypeConverterAttribute
TypeDescriptor.GetConverter использует TypeConverterAttribute , и IMHO предлагает как лучший API для преобразования типа, так и более элегантный способ сделать тип конвертируемым. Но он сталкивается с теми же проблемами производительности с классом Convert
, вызванными не универсальными методами.
Анализировать / TryParse
Использование методов T.Parse
/ T.TryParse
является де-факто способом создания объекта из строки, поскольку он не включает в себя ненужный бокс. Они также обычно имеют перегрузки, которые обеспечивают больший контроль над тем, как анализировать строку.
TryParse
методы позволяют вам обрабатывать случаи, когда строка, которую вы хотите проанализировать, получается из пользовательского ввода или другого значения, которое не гарантирует правильного форматирования строки, без выдачи исключений.
Так что вы должны вызывать Parse
/ TryParse
методы типа , когда вы можете , и переходить на другие способы только тогда, когда вы не знаете тип цели во время компиляции, т.е. когда вы есть только объект Type , представляющий целевой тип.
Вы также можете взглянуть на мою маленькую библиотеку под названием ValueString , которая находит наиболее подходящий метод синтаксического анализа для типа и использует его для анализа строки.