【发布时间】:2012-07-28 09:59:28
【问题描述】:
我对@987654321@ 有疑问,简而言之:如果DateTimeOffset 实施IConvertible 我不会有问题。
你不能使用扩展方法来实现一个接口,所以这条路是封闭的。结构 DateTimeOffset 不是部分的,因此不能以这种方式扩展。
在阅读一些 MSDN 文档时,我遇到了 TypeCode 枚举,这似乎是 IConvertible 正常工作所必需的。令我失望的是,枚举也不包含 TimeSpan,这关闭了使用DateTime 和TimeSpan 的类似Tuple 的结构的选项(即DateTimeOffset =P)
我的问题如下:您将如何实现具有基本 IConvertible 或类似支持的 DateTimeOffset 等效项?
该实现涉及具有[index,TType] where TType : IConvertible(setter、getter 和 try-getter)功能的精美惰性字典实现,并且它需要能够存储特定于时区的数据。
到目前为止我的想法:
创建一个新的
ISuperConvertible接口,它实际上只是IConvertible的扩展,并使DateTimeOffset成为一个特例。这通常会破坏我们对 IConvertible 的支持,但适用于这种非常具体的情况。利弊?使用两个“槽”来存储
DateTimeOffsets,一个用于DateTime,一个用于int半小时偏移(所有时区都不是整小时=/)。然后我们就失去了cache[ApplicationStrings.LastUpdate, default : DateTimeOffset.Min]功能。
这些代表我的主要想法,即打破DateTimeOffset并保留IConvertible或打破IConvertible并保留DateTimeOffset。
我对 C# 的内在特性还很陌生,因此任何见解都会有所帮助。你有什么想法?
编辑: 补充:
- 现在有一个使用 DateTime(固定时区)的工作解决方案,但现在也需要时区,最佳方案是在任何地方都使用 DateTimeOffset。这个问题本质上不是重构,而是我的具体问题。
- 这是一个相当大的应用程序,它使用实体框架和其他更模糊的框架来与不同的服务和存储进行通信,因此保持它是一个简单的系统定义类型不会破坏 LINQ-to-X 优化等(我不知道自己做这些有多难)。
- 我反对拆分数据,因为我不知道其他人何时会出现并注意到有一个 DateTime 用于时间戳,并在不考虑偏移(时区)的情况下使用它。
【问题讨论】:
-
你到底想用这个
ISuperConvertible做什么? -
请注意,对于已经编译的代码,不存在局部的概念——它只是在源代码级别。
-
您是否考虑过删除时区信息并将字典中的所有日期设为UTC?然后你可以使用 DateTimeOffset.UtcDateTime 来获取 DateTime,它确实实现了 IConvertible。
-
你需要什么?你想做什么?
-
我知道这非常简单而且可能很幼稚,但是您是否考虑过在将 DateTimeOffset 存储到字典之前将其转换为字符串?
.ToString(System.Globalization.DateTimeFormatInfo.InvariantInfo)
标签: c# casting datetimeoffset iconvertible