【问题标题】:Implementing IConvertible like functionality for non modifiable types为不可修改的类型实现类似 IConvertible 的功能
【发布时间】:2012-07-28 09:59:28
【问题描述】:

我对@9​​87654321@ 有疑问,简而言之:如果DateTimeOffset 实施IConvertible 我不会有问题。

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

在阅读一些 MSDN 文档时,我遇到了 TypeCode 枚举,这似乎是 IConvertible 正常工作所必需的。令我失望的是,枚举也不包含 TimeSpan,这关闭了使用DateTimeTimeSpan 的类似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


【解决方案1】:

您可以在 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
}

【讨论】:

  • 这是个好主意,但是当不使用标准 .NET 类型时,它会遇到实体框架和一些数据库提供程序的一些问题,所以很遗憾它不是一个选项。
  • 您需要在哪里实现 IConvertible?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2021-01-13
  • 2015-10-22
相关资源
最近更新 更多