为什么 Convert.ChangeType(string) 与 DateTimeOffset 一起工作时却不能与 DateTime 一起工作?

Why doesn't Convert.ChangeType(string) work with DateTimeOffset, when it works with DateTime?

即使我提供时区也会出现这种情况。

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 即时实现一个包罗万象的类型转换器。它适用于除 DateTimeOffset.

以外的其他类型(例如 float <-> intstring -> DateTime

如果您查看 Convert.ChangeType 方法的文档,您会看到以下注释:

Exceptions
InvalidCastException
This conversion is not supported.
-or-
value is null and conversionType is a value type.
-or-
value does not implement the IConvertible interface.


既然我们知道value不为null,并且string实现了IConvertible接口,那么就只剩下第一个原因了:

This conversion is not supported.


我们可以做的是先将其转换为DateTime,然后再将其转换为DateTimeOffset。有一些文档 here 描述了实现此目的的各种方法,其中之一是:

"You can also create a new DateTimeOffset value by assigning it a DateTime value"

所以我们可以这样做:

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