Поскольку вы печатаете одно и то же сообщение во всех трех местах, где исключено исключение, трудно сказать с какой-либо определенностью, что происходит:
printStackTrace()
, чтобы узнать где происходит исключение Exception
, как это. Поймите исключения, которые вы ожидаете, и что ваш код предназначен для обработки. Если вы поймаете Exception
, вы можете поймать всевозможные неожиданные исключения (NPE, конец файла и т. Д.) ... и неправильно сообщать о них как «Недопустимый формат». В этом конкретном случае есть один более простой вариант: вызовите ToString()
для значения. Для строки это просто вернет исходную ссылку.
В общем случае вам придется конвертировать значение из объекта в объект и обратно, что, к сожалению, довольно некрасиво. С точки зрения производительности, я был бы весьма удивлен, если бы обнаружил, что это узкое место - но я подозреваю, что вызов ToString()
так же эффективен, как и все остальное.
Теперь я фактически проанализировал код с помощью Reflector (но на самом деле заботился только об эквиваленте вывода ILDASM - на самом деле средство визуализации C # и VB.NET не отображает приведение к объект в любом направлении):
DirectCast (DirectCast (value, Object), String)
скомпилирован в
box !!T
castclass string
, но DirectCast (DirectCast (newvalue, Object), T)
скомпилирован в
unbox.any !!T
Так что я доволен этим (поскольку я действительно заботился только о приведении к T, как я сказал в своем комментарии к ответу Джона Скита).