Согласно документации MSDN :
Чтобы преобразование было успешным, значение должно реализовывать интерфейс IConvertible, поскольку метод просто переносит вызовсоответствующему IConvertible методу.Метод требует, чтобы поддерживалось преобразование значения в translationType .
Если смотреть на интерфейс IConvertible
, он имеет ToType
метод.Вы могли бы попробовать это, может быть?(Отказ от ответственности: у меня нет. Это всего лишь мысль.)
Редактировать : В вашем случае кажется, что вы хотите преобразовать из astring
до a Foo
.Поскольку тип string
(очевидно) не определяет преобразование в Foo
в его реализации IConvertible
, я считаю, что вам не повезло.
Обновление Я не хочу утверждать, что именно так вы должны всегда подходить к такого рода проблемам, но ...
Я посмотрел на код для Convert.ChangeType
в Reflector ,Это долго;Я не буду воспроизводить это здесь.Но в основном он работает так, как сказано в документации: он только работает, если:
- Параметр
value
является ненулевым экземпляром типа, который реализует IConvertible
, или: - Тип параметра
value
и параметра conversionType
совпадают (поэтому: Convert.ChangeType(myFoo, typeof(Foo))
также будет работать, хотя это будет довольно бесполезно).
Затем он циклически перебирает все типы, поддерживаемые IConvertible
(который явно не включает в себя какие-либо определяемые пользователем типы), и в конечном итоге использует ToType
в качестве запасного варианта.
Такнам нужно взглянуть на реализацию string
типа ToType
.
К сожалению, это одна неудачная строка:
return Convert.DefaultToType(this, type, provider);
Что делает DefaultToType
?Точно то же самое, что и ChangeType
(минус резервный ToType
, очевидно, чтобы избежать бесконечной рекурсии).
Так что это просто не сработает.
Если выабсолютно привязанный к этой сторонней библиотеке, которая использует Convert.ChangeType
за кулисами, я бы порекомендовал связаться с разработчиком библиотеки и попросить их каким-то образом расширить их API, что позволит вам выполнить то, что вы пытаетесь достичь.Возможны следующие варианты:
- Принятие необязательного параметра делегата
Converter<string, T>
или Func<string, T>
, как предложил Бен Фойгт в комментарии. - Принятие
TypeConverter
параметр - Прием параметра некоторого типа, который реализует интерфейс, такой как
IParser<T>
В любом случае, удачи.