2009-09-21 10 views

Répondre

1

En supposant que vous parlez d'instances DateTime dans un DataContract envoyé par le serveur, je ne pense pas qu'il existe un moyen simple de le faire. Les modèles que vous mentionnez ne sont pas utilisés (s'ils l'étaient, vous pourriez simplement pirater l'instance de modèle partagé via la réflexion pour une solution grossière mais facile). Le DataContractSerializer délègue finalement la tâche à la méthode interne XsdDateTime.ToString(), qui est codée en dur pour toujours émettre les secondes fractionnaires si elles sont non nulles. Ce n'est pas élégant, mais tirer parti du comportement codé en dur pourrait être la solution la plus simple: il suffit de copier tous vos DateTimes, en réinitialisant les millisecondes à zéro avant de quitter le serveur. Alternativement, il vous reste à brancher un IDispatchMessageFormatter ou IDispatchMessageInspector personnalisé sur les opérations affectées. Il est également possible d'utiliser un IDispatchMessageFormatter ou un IDispatchMessageInspector personnalisé. Il n'y a pas non plus de promenade dans le parc si vous voulez qu'ils soient génériques et faciles à raccorder. Juste curieux - avez-vous un client qui se comporte mal qui ne comprend pas les secondes fractionnaires?

0

J'ai trouvé quelques moyens de résoudre ce problème. Les méthodes plus complexes impliquent l'accrochage d'un point de terminaison MessageFormatter personnalisé.

Nous avons trouvé un moyen simple de faire cela.

la fraction de secondes n'est générée que si l'objet datetime en possède.

Ce que nous avons fait:

Nous avons créé un statique sur propertyChange gestionnaire d'événements qui utilise la réflexion pour détecter les types de données datetime. Une fois trouvé, nous recréons le datetime sans les fractions de secondes. Dans notre cas, nous nous foutions des secondes. Nous câblons l'événement dans un constructeur de classe partielle. C'est tout.

Bien sûr

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); 
Questions connexes