2012-07-30 111 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

相關問題