From 97b2cbfde4bd6a760793bd23b285e762b9a8071f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 4 Aug 2021 15:12:38 +0200 Subject: [PATCH] Improve type conversion error message --- .../Exceptions/TypeConversionException.cs | 22 +++++++++++++++++++ .../Extensions/ObjectConverter.cs | 11 +++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/core/Elsa.Abstractions/Exceptions/TypeConversionException.cs diff --git a/src/core/Elsa.Abstractions/Exceptions/TypeConversionException.cs b/src/core/Elsa.Abstractions/Exceptions/TypeConversionException.cs new file mode 100644 index 000000000..12f2edd31 --- /dev/null +++ b/src/core/Elsa.Abstractions/Exceptions/TypeConversionException.cs @@ -0,0 +1,22 @@ +using System; + +namespace Elsa.Exceptions +{ + public class TypeConversionException : Exception + { + public object Value { get; } + public Type TargetType { get; } + + public TypeConversionException(string message, object value, Type targetType) : base(message) + { + Value = value; + TargetType = targetType; + } + + public TypeConversionException(string message, object value, Type targetType, Exception innerException) : base(message, innerException) + { + Value = value; + TargetType = targetType; + } + } +} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Extensions/ObjectConverter.cs b/src/core/Elsa.Abstractions/Extensions/ObjectConverter.cs index 1ed3bb420..fca1f74f3 100644 --- a/src/core/Elsa.Abstractions/Extensions/ObjectConverter.cs +++ b/src/core/Elsa.Abstractions/Extensions/ObjectConverter.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using Elsa.Exceptions; using Newtonsoft.Json.Linq; using NodaTime; using NodaTime.Text; @@ -53,8 +54,16 @@ namespace Elsa if (underlyingSourceType != typeof(string)) return Enum.ToObject(underlyingTargetType, value); } + + try + { + return Convert.ChangeType(value, underlyingTargetType); + } + catch (InvalidCastException e) + { + throw new TypeConversionException($"Failed to convert an object of type {sourceType} to {underlyingTargetType}", value, underlyingTargetType, e); + } - return Convert.ChangeType(value, underlyingTargetType); } } } \ No newline at end of file