2009-09-21 28 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); 
相关问题