デフォルトとは異なる形式を使用して、c#の日時オブジェクトを強制的にシリアル化しようとしています。ミリ秒は含めたくありません。SortableDateTimePatternおよびUniversalSortableDateTimePatternは読み取り専用です。
2 に答える
サーバーによって送信されるDataContractのDateTimeインスタンスについて話していると仮定すると、これを行う簡単な方法はないと思います。あなたが言及したパターンは使用されていません(使用されている場合は、リフレクションを介して共有パターンインスタンスをハックして、大まかな、しかし簡単なソリューションにすることができます)。DataContractSerializerは、最終的にタスクを内部XsdDateTime.ToString()メソッドに委任します。このメソッドは、ゼロ以外の場合は常に小数秒を出力するようにハードコーディングされています。
エレガントではありませんが、ハードコードされた動作を利用するのが最も簡単な解決策かもしれません。すべてのDateTimeをコピーし、サーバーを離れる前にミリ秒をゼロにリセットするだけです。
または、影響を受ける操作でカスタムIDispatchMessageFormatterまたはIDispatchMessageInspectorをフックする必要があります。それらを一般的で簡単に接続できるようにしたい場合は、公園を散歩することもできません。
ただ好奇心が強い-あなたは小数秒を理解していない不正なクライアントを持っていますか?
私はこの問題を処理するいくつかの方法を考え出しました。より複雑な方法には、カスタムMessageFormatterエンドポイントのフックが含まれます。
これを行う簡単な方法を見つけました。
秒の小数部は、日時オブジェクトに秒が含まれている場合にのみ生成されます。
我々のしたこと:
リフレクションを使用して日時データ型を検出するstaticonpropertychangeイベントハンドラーを作成しました。見つかったら、秒の端数なしで日時を再作成します。私たちの場合、秒はまったく気にしませんでした。イベントを部分クラスコンストラクターに接続します。それでおしまい。
もちろん
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);