为不可修改的类型实现类似IConvertible的功能

时间:2012-07-30 17:28:57

标签: c# casting datetimeoffset iconvertible

我对IConvertible存在问题,简而言之:如果DateTimeOffset已实施IConvertible,我就不会有问题。

您无法使用扩展方法来实现接口,因此道路已关闭。结构DateTimeOffset不是部分的,因此不能以这种方式扩展。

在某些MSDN文档中阅读时,我遇到了TypeCode枚举,这似乎是IConvertible正常工作所必需的。令我失望的是,枚举也没有包含TimeSpan,这使得TupleDateTime TimeSpan类似DateTimeOffset结构的选项结束(即[index,TType] where TType : IConvertible = P)< / p>

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

该实现涉及使用ISuperConvertible(包括setter,getters和try-getters)功能的花哨懒惰字典实现,并且它需要能够存储时区特定数据。

到目前为止我的想法:

  • 创建一个新的IConvertible界面,实际上只是DateTimeOffset的扩展,并使DateTimeOffset成为特例。这一般会打破我们的IConvertible支持,但对这个非常具体的案例起作用。优点和缺点?

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

这些代表了我的主要想法,即中断IConvertible并保持IConvertible或中断DateTimeOffset并保持{{1}}。

我仍然对C#的内在特性不熟悉,所以任何见解都会有所帮助。你有什么想法?

编辑: 加法:

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

1 个答案:

答案 0 :(得分: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
}
相关问题