diff --git a/src/modules/Elsa.Expressions/Helpers/ObjectConverter.cs b/src/modules/Elsa.Expressions/Helpers/ObjectConverter.cs index 598facddd..680af1c56 100644 --- a/src/modules/Elsa.Expressions/Helpers/ObjectConverter.cs +++ b/src/modules/Elsa.Expressions/Helpers/ObjectConverter.cs @@ -94,6 +94,9 @@ public static class ObjectConverter if (underlyingSourceType == underlyingTargetType) return value; + if (IsDateType(underlyingSourceType) && IsDateType(underlyingTargetType)) + return ConvertAnyDateType(value, underlyingTargetType); + if (typeof(IDictionary).IsAssignableFrom(underlyingSourceType) && underlyingTargetType.IsClass) { if (typeof(ExpandoObject) == underlyingTargetType) @@ -183,4 +186,55 @@ public static class ObjectConverter throw new TypeConversionException($"Failed to convert an object of type {sourceType} to {underlyingTargetType}", value, underlyingTargetType, e); } } + + /// + /// Returns true if the specified type is date-like type, false otherwise. + /// + private static bool IsDateType(Type type) + { + var dateTypes = new[] + { + typeof(DateTime), + typeof(DateTimeOffset), + typeof(DateOnly) + }; + + return dateTypes.Contains(type); + } + + /// + /// Converts any date type to the specified target type. + /// + /// Any of , or . + /// Any of , or . + /// The converted value. + /// Thrown if is not of type , or . + private static object ConvertAnyDateType(object value, Type targetType) + { + return targetType switch + { + { } t when t == typeof(DateTime) => value switch + { + DateTime dateTime => dateTime, + DateTimeOffset dateTimeOffset => dateTimeOffset.DateTime, + DateOnly date => new DateTime(date.Year, date.Month, date.Day), + _ => throw new ArgumentException("Invalid value type.") + }, + { } t when t == typeof(DateTimeOffset) => value switch + { + DateTime dateTime => new DateTimeOffset(dateTime), + DateTimeOffset dateTimeOffset => dateTimeOffset, + DateOnly date => new DateTimeOffset(date.Year, date.Month, date.Day, 0, 0, 0, TimeSpan.Zero), + _ => throw new ArgumentException("Invalid value type.") + }, + { } t when t == typeof(DateOnly) => value switch + { + DateTime dateTime => new DateOnly(dateTime.Year, dateTime.Month, dateTime.Day), + DateTimeOffset dateTimeOffset => new DateOnly(dateTimeOffset.Year, dateTimeOffset.Month, dateTimeOffset.Day), + DateOnly date => date, + _ => throw new ArgumentException("Invalid value type.") + }, + _ => throw new ArgumentException("Invalid target type.") + }; + } } \ No newline at end of file