2009-09-21 3 views

답변

1

서버에서 보낸 DataContract의 DateTime 인스턴스에 대해 이야기한다고 가정하면이 작업을 수행하는 간단한 방법은 없다고 생각합니다. 당신이 언급 한 패턴은 사용되지 않습니다 (그렇다면 총체적이지만 쉬운 해결책을 위해 리플렉션을 통해 공유 패턴 인스턴스를 해킹 할 수 있습니다). DataContractSerializer는 궁극적으로 작업을 내부 XsdDateTime.ToString() 메서드에 위임합니다.이 메서드는 0이 아닌 경우 소수 자릿수 초를 항상 방출하도록 하드 코드됩니다.

우아한 것은 아니지만 하드 코딩 된 동작을 이용하는 것이 가장 간단한 해결책 일 수 있습니다. 모든 DateTimes를 복사하고 서버를 떠나기 전에 밀리 초를 0으로 재설정하십시오.

또는 영향을받는 작업에 사용자 지정 IDispatchMessageFormatter 또는 IDispatchMessageInspector를 연결해야합니다. 그들이 일반적이고 쉽게 연결되기를 원한다면 공원을 걷지도 않습니다.

소수의 초를 이해하지 못하는 클라이언트가 궁금한가요?

0

이 문제를 처리 할 수있는 몇 가지 방법을 찾아 냈습니다. 보다 복잡한 메소드에는 커스텀 MessageFormatter Endpoint를 후킹하는 것이 포함됩니다.

우리는이 간단한 방법을 발견했습니다.

초의 소수 부분은 datetime 개체에있는 경우에만 생성됩니다.

우리가 무슨 짓을 :

우리는 날짜 시간 데이터 유형을 감지하는 반사를 사용의 PropertyChange 이벤트 핸들러에 정적 만들었습니다. 발견되면 초 단위로 datetime을 다시 만듭니다. 우리의 경우에는 초를 전혀 신경 쓰지 않았습니다. 부분 클래스 생성자에서 이벤트를 연결합니다. 그게 전부 야. 물론

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); 
관련 문제