简而言之,我有一个问题IConvertible
:如果DateTimeOffset
实施IConvertible
,我不会有问题。
你不能使用扩展方法来实现一个接口,所以这条路是封闭的。结构 DateTimeOffset 不是部分的,因此不能以这种方式扩展。
在阅读一些 MSDN 文档时,我遇到了TypeCode
枚举,这似乎是 IConvertible 正常工作所必需的。令我失望的是,枚举也不包含 TimeSpan,这关闭了使用带有and的类似Tuple
结构的选项(即=P)DateTime
TimeSpan
DateTimeOffset
我的问题如下:您将如何实现具有基本 IConvertible 或类似支持的 DateTimeOffset 等效项?
该实现涉及具有[index,TType] where TType : IConvertible
(setter、getter 和 try-getter)功能的花哨的惰性字典实现,并且它需要能够存储特定于时区的数据。
到目前为止我的想法:
创建一个新的
ISuperConvertible
接口,它实际上只是一个扩展IConvertible
和DateTimeOffset
一个特例。这通常会破坏我们对 IConvertible 的支持,但适用于这种非常具体的情况。优点和缺点?使用两个“槽”来存储
DateTimeOffset
s,一个用于存储,一个DateTime
用于半int
小时偏移(所有时区都不是整小时 =/)。然后我们失去了cache[ApplicationStrings.LastUpdate, default : DateTimeOffset.Min]
功能。
这些代表了我的主要想法,即 break DateTimeOffset
and keepIConvertible
或 break IConvertible
and keep DateTimeOffset
。
我对 C# 的内在特性仍然很陌生,因此任何见解都会有所帮助。你觉得呢?你有没有什么想法?
编辑:补充:
- 现在有一个使用 DateTime(固定时区)的工作解决方案,但现在也需要时区,最佳方案是在任何地方都使用 DateTimeOffset。本质上的问题不是重构,而是我的具体问题。
- 这是一个相当大的应用程序,它使用实体框架和其他更模糊的框架来与不同的服务和存储进行通信,因此保持它是一个简单的系统定义类型不会破坏 LINQ-to-X 优化等(我不知道这些有多难)是自己做的)。
- 我反对拆分数据,因为我不知道其他人何时会出现并注意到有一个 DateTime 用于时间戳,并且在不考虑偏移量(时区)的情况下使用它。