2009-09-21 50 views

回答

1

假設你在談論服務器發送的DataContract中的DateTime實例,我不認爲有一種簡單的方法可以做到這一點。您提到的模式不被使用(如果是的話,您可以通過反射來破解共享模式實例,以獲得一個非常簡單的解決方案)。 DataContractSerializer最終將任務委託給內部的XsdDateTime.ToString()方法,該方法經過硬編碼,如果它們非零,則始終發出小數秒。

這並不優雅,但利用硬編碼行爲可能是最簡單的解決方案:只需複製所有日期時間,在離開服務器之前將毫秒重置爲零。

另外,您還需要在受影響的操作上連接自定義IDispatchMessageFormatter或IDispatchMessageInspector。如果你想讓它們變得通用並且容易連接起來,那麼在公園裏散步也不是。

只是好奇 - 你有一個行爲不端的客戶,不明白小數秒嗎?

0

我想出了一些辦法來解決這個問題。更復雜的方法涉及到自定義MessageFormatter端點的掛鉤。

我們找到了一個簡單的方法來解決這個問題。

秒的分數只有在日期時間對象具有它們時纔會生成。

我們做了什麼:

我們創建了一個使用反射來檢測日期時間數據類型PropertyChange事件處理程序的靜態。當發現我們重新創建日期時間沒有秒的分數。在我們的案例中,我們根本不在乎秒。我們通過部分類構造函數將事件連接起來。而已。

當然

public static class DateTimeSecondCatcher 
{ 
    PropertyInfo dateTimePropertyInfo = sender.GetType().GetProperty(e.PropertyName); 
     if ((dateTimePropertyInfo != null) && (dateTimePropertyInfo.PropertyType == typeof(DateTime))) 
     { 

      DateTime dteValue = (DateTime)dateTimePropertyInfo.GetValue(sender, null); 
      if (dteValue.Millisecond > 0) 
      { 
       dateTimePropertyInfo.SetValue(sender, new DateTime(dteValue.Year,dteValue.Month,dteValue.Day, dteValue.Hour,dteValue.Minute,dteValue.Second,0,dteValue.Kind), null); 
      } 
     } 

} 


// This code goes in the partial class constructor 
this.PropertyChanged += new PropertyChangedEventHandler(DateTimeSecondCatcher.OnPropertyChanged); 
相關問題