En mi aplicación, recupero objetos de dominio a través de un servicio web. En los datos del servicio web, sé que todos los valores de fecha son UTC, pero el servicio web no formatea sus valores xs:dateTime
como fechas UTC. (En otras palabras, la letra Z
no se adjunta al final de cada fecha para indicar UTC.)Cómo configurar DateTime.Kind para todas las propiedades de DateTime en un objeto usando Reflection
No puedo cambiar la forma en que se comporta el servicio web en este momento, pero como solución alternativa he creado un método que llamo inmediatamente después de que los objetos del servicio web hayan sido deserializados.
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);
}
}
}
El método toma un objeto y bucles a través de sus propiedades, la búsqueda de las propiedades que son o bien (se supone que) DateTime
o Nullable<DateTime>
, y luego establece explícitamente la propiedad DateTime.Kind
para cada uno de los valores de propiedad para DateTimeKind.Utc
.
El código no arroja ninguna excepción, pero obj
nunca obtiene sus propiedades DateTime modificadas. En el depurador se llama p.SetValue(obj, date, null);
, pero obj
nunca se modifica.
¿Por qué no se aplican los cambios a obj
?
¿Cómo se determina que obj no está actualizado? –
@Stefan Lo puedo ver en el depurador. Sus valores de propiedad no son modificados. – RunnerRick
Intente cambiar el valor no solo el tipo, quizás agregando para ver si cambia. Cambiar el tipo no debería cambiar el valor. – Aliostad