В моем приложении я получаю объекты домена через веб-службу. В данных веб-службы я знаю, что все значения даты - это UTC, но веб-служба не форматирует значения xs:dateTime
в качестве дат UTC. (Другими словами, буква Z
не добавляется к концу каждой даты, чтобы указать UTC.)
Я не могу изменить способ ведения веб-службы в это время, но в качестве обходного пути я создал метод, который я вызываю сразу же после того, как объекты из веб-службы были десериализованы.
private void ExplicitlyMarkDateTimesAsUtc<T>(T obj) where T : class
{
Type t = obj.GetType();
// Loop through the properties.
PropertyInfo[] props = t.GetProperties();
for (int i = 0; i < props.Length; i++)
{
PropertyInfo p = props[i];
// If a property is DateTime or DateTime?, set DateTimeKind to DateTimeKind.Utc.
if (p.PropertyType == typeof(DateTime))
{
DateTime date = (DateTime)p.GetValue(obj, null);
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
p.SetValue(obj, date, null);
}
// Same check for nullable DateTime.
else if (p.PropertyType == typeof(Nullable<DateTime>))
{
DateTime? date = (DateTime?)p.GetValue(obj, null);
DateTime? newDate = DateTime.SpecifyKind(date.Value, DateTimeKind.Utc);
p.SetValue(obj, newDate, null);
}
}
}
Метод берет объект и перебирает его свойства, обнаруживая свойства, которые являются либо DateTime
, либо Nullable<DateTime>
, а затем (предполагается) явно устанавливает свойство DateTime.Kind
для каждого из значений свойств DateTimeKind.Utc
.
Код не генерирует никаких исключений, но obj
никогда не изменяет свойства DateTime. В отладчике p.SetValue(obj, date, null);
вызывается, но obj
никогда не изменяется.
Почему не применяются изменения к obj
?