Почему Convert.ChangeType (string) не работает с DateTimeOffset, когда он работает с DateTime? - PullRequest
1 голос
/ 18 июня 2019

Это происходит даже тогда, когда я предоставляю часовой пояс.

var dateString = "2008-09-22T14:01:54.9571247Z";
var dateTime = Convert.ChangeType(dateString, typeof(DateTime));  // works
var dateTimeOffset = Convert.ChangeType(dateString, typeof(DateTimeOffset));  // throws InvalidCast exception

Почему это происходит?

И что я пытаюсь сделать, это реализовать универсальный преобразователь типов на летус Convert.ChangeType.Работает с другими типами (например, float <-> int, string -> DateTime), за исключением DateTimeOffset.

1 Ответ

1 голос
/ 18 июня 2019

Если вы посмотрите документацию для метода Convert.ChangeType, вы увидите следующее примечание:

Исключения
InvalidCastException
Это преобразование не поддерживается.
-или-
value равно null и conversionType является типом значения.
-или-
value не реализует интерфейс IConvertible .


Поскольку мы знаем, что value не является нулевым, а string реализует интерфейс IConvertible, тоединственная оставшаяся причина - первая:

Это преобразование не поддерживается.


Что мы можем do - сначала преобразовать его в DateTime, а затем преобразовать в DateTimeOffset.Существует некоторая документация здесь , которая описывает различные методы для достижения этой цели, один из которых:

"Вы также можете создать новое значение DateTimeOffset, назначив ему DateTimeзначение "

Так что мы можем просто сделать:

DateTimeOffset dateTimeOffset = (DateTime) Convert.ChangeType(dateString, typeof(DateTime));
...