3

简而言之,我有一个问题IConvertible:如果DateTimeOffset实施IConvertible,我不会有问题。

你不能使用扩展方法来实现一个接口,所以这条路是封闭的。结构 DateTimeOffset 不是部分的,因此不能以这种方式扩展。

在阅读一些 MSDN 文档时,我遇到了TypeCode枚举,这似乎是 IConvertible 正常工作所必需的。令我失望的是,枚举也不包含 TimeSpan,这关闭了使用带有and的类似Tuple结构的选项(即=P)DateTimeTimeSpanDateTimeOffset

我的问题如下:您将如何实现具有基本 IConvertible 或类似支持的 DateTimeOffset 等效项?

该实现涉及具有[index,TType] where TType : IConvertible(setter、getter 和 try-getter)功能的花哨的惰性字典实现,并且它需要能够存储特定于时区的数据。

到目前为止我的想法:

  • 创建一个新的ISuperConvertible接口,它实际上只是一个扩展IConvertibleDateTimeOffset一个特例。这通常会破坏我们对 IConvertible 的支持,但适用于这种非常具体的情况。优点和缺点?

  • 使用两个“槽”来存储DateTimeOffsets,一个用于存储,一个DateTime用于半int小时偏移(所有时区都不是整小时 =/)。然后我们失去了cache[ApplicationStrings.LastUpdate, default : DateTimeOffset.Min]功能。

这些代表了我的主要想法,即 break DateTimeOffsetand keepIConvertible或 break IConvertibleand keep DateTimeOffset

我对 C# 的内在特性仍然很陌生,因此任何见解都会有所帮助。你觉得呢?你有没有什么想法?

编辑:补充:

  • 现在有一个使用 DateTime(固定时区)的工作解决方案,但现在也需要时区,最佳方案是在任何地方都使用 DateTimeOffset。本质上的问题不是重构,而是我的具体问题。
  • 这是一个相当大的应用程序,它使用实体框架和其他更模糊的框架来与不同的服务和存储进行通信,因此保持它是一个简单的系统定义类型不会破坏 LINQ-to-X 优化等(我不知道这些有多难)是自己做的)。
  • 我反对拆分数据,因为我不知道其他人何时会出现并注意到有一个 DateTime 用于时间戳,并且在不考虑偏移量(时区)的情况下使用它。
4

1 回答 1

0

您可以在 DateTimeOffset 上创建自己的包装类,以实现 IConvertible。此类将具有 DateTimeOffset 属性,您将用于包装器属性和方法。并为它实现 IConvertible 的方法。例子:

public class DTOffset:IConvertible
{
    private DateTimeOffset DateTimeOffset;

    //Implementation of IConvertible
    public long ToInt64(IFormatProvider provider)
    {
        return DateTimeOffset.Ticks;
    }

    public DateTime ToDateTime(IFormatProvider provider)
    {
        DateTimeOffset.DateTime;
    }
    //and so on

    //wrapper properites of DateTimeOffset:
    public int DayOfYear{get{return DateTimeOffset.DayOfYear;}}

    public DateTime Date{get{return DateTimeOffset.Date;}}
    //and so on
}
于 2012-07-30T19:53:55.457 回答