2012-07-30 99 views
3

我有一个问题IConvertible,简而言之:如果DateTimeOffset实施IConvertible我不会有问题。实现类似于非可修改类型的功能

不能使用扩展方法来实现一个接口,使这条道路被关闭。 struct DateTimeOffset不是部分的,所以不能以这种方式扩展。

当读到一些MSDN文档时,我碰到了TypeCode枚举,这似乎是IConvertible正常工作所需要的。而令我失望的枚举不包含任何时间跨度,其封闭使用Tuple状结构DateTimeTimeSpan(即DateTimeOffset = P)

我的问题是如下的选项:你将如何实现一个DateTimeOffset-具有基本的IConvertible或类似支持的等价物?

该实现涉及一个花式懒惰字典实现[index,TType] where TType : IConvertible(包括setter,getter和try-getters)功能,它需要能够存储特定于时区的数据。

我的想法而已:

  • 创建一个新的ISuperConvertible接口,这在现实中只是一个扩展IConvertibleDateTimeOffset一个特例。这一般会打破我们对IConvertible的支持,但是为这个非常具体的案例工作。优点和缺点?

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

那些代表我的主要思想,即打破DateTimeOffset并保持IConvertible或打破IConvertible并保持DateTimeOffset

我还是新来的C#的内在特点,所以任何见解将是有益的。你怎么看?

编辑: 加法:

  • 有现在一个可行的解决方案,它使用日期时间(固定的时区),但是现在需要的时区为好,最佳的情况是只使用的DateTimeOffset无处不来代替。其本质上的问题不是重构,而是我的具体问题是。
  • 这是一个相当大的应用程序,它使用实体框架等比较模糊的框架,以提供不同的服务和储存通信,因此保持它的简单系统定义的类型不会打破LINQ到-X优化等(我不知道自己做这些事有多难)。
  • 我反对分裂的数据,因为我不知道什么时候另一个人会来发现,有用于时间戳日期时间,并使用它没有采取偏移(时区)考虑在内。
+2

你究竟想用这个'ISuperConvertible'来做什么? – 2012-07-30 17:30:23

+1

请注意,对于已编译的代码,不存在这样的概念 - 仅在源代码级别。 – 2012-07-30 17:39:08

+1

您是否考虑过删除时区信息并在UTC字典中设置所有日期?然后你可以使用DateTimeOffset.UtcDateTime来获取实现IConvertible的DateTime。 – JamieSee 2012-07-30 18:24:25

回答

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 
} 
+0

这是一个好主意,但它运行了一些问题与实体框架和没有使用标准的.NET类型时,一些数据库提供的,因此它是可悲的是不是一个选项。 – flindeberg 2012-07-30 21:03:04

+0

你需要在哪里实施IConvertible? – 2012-07-30 21:38:45

相关问题