我有一个问题IConvertible
,简而言之:如果DateTimeOffset
实施IConvertible
我不会有问题。实现类似于非可修改类型的功能
不能使用扩展方法来实现一个接口,使这条道路被关闭。 struct DateTimeOffset不是部分的,所以不能以这种方式扩展。
当读到一些MSDN文档时,我碰到了TypeCode
枚举,这似乎是IConvertible正常工作所需要的。而令我失望的枚举不包含任何时间跨度,其封闭使用Tuple
状结构DateTime
和TimeSpan
(即DateTimeOffset
= P)
我的问题是如下的选项:你将如何实现一个DateTimeOffset-具有基本的IConvertible或类似支持的等价物?
该实现涉及一个花式懒惰字典实现[index,TType] where TType : IConvertible
(包括setter,getter和try-getters)功能,它需要能够存储特定于时区的数据。
我的想法而已:
创建一个新的
ISuperConvertible
接口,这在现实中只是一个扩展IConvertible
并DateTimeOffset
一个特例。这一般会打破我们对IConvertible的支持,但是为这个非常具体的案例工作。优点和缺点?使用两个“槽”用于存储
DateTimeOffset
S,一个用于DateTime
,一个用于int
halfhour偏移(所有时区不是整个小时= /)。然后我们失去了cache[ApplicationStrings.LastUpdate, default : DateTimeOffset.Min]
的功能。
那些代表我的主要思想,即打破DateTimeOffset
并保持IConvertible
或打破IConvertible
并保持DateTimeOffset
。
我还是新来的C#的内在特点,所以任何见解将是有益的。你怎么看?
编辑: 加法:
- 有现在一个可行的解决方案,它使用日期时间(固定的时区),但是现在需要的时区为好,最佳的情况是只使用的DateTimeOffset无处不来代替。其本质上的问题不是重构,而是我的具体问题是。
- 这是一个相当大的应用程序,它使用实体框架等比较模糊的框架,以提供不同的服务和储存通信,因此保持它的简单系统定义的类型不会打破LINQ到-X优化等(我不知道自己做这些事有多难)。
- 我反对分裂的数据,因为我不知道什么时候另一个人会来发现,有用于时间戳日期时间,并使用它没有采取偏移(时区)考虑在内。
你究竟想用这个'ISuperConvertible'来做什么? – 2012-07-30 17:30:23
请注意,对于已编译的代码,不存在这样的概念 - 仅在源代码级别。 – 2012-07-30 17:39:08
您是否考虑过删除时区信息并在UTC字典中设置所有日期?然后你可以使用DateTimeOffset.UtcDateTime来获取实现IConvertible的DateTime。 – JamieSee 2012-07-30 18:24:25