From a819eff46cee0ca08050b472ab28e7dc95aba777 Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Tue, 18 Feb 2020 17:14:40 +0800 Subject: [PATCH] Merge pull request #3585 from AvaloniaUI/fixes/3584-convert-timespan Use TypeConverters in TypeUtilities.TryConvert --- src/Avalonia.Base/Utilities/TypeUtilities.cs | 9 +++++++++ .../Data/DefaultValueConverterTests.cs | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Avalonia.Base/Utilities/TypeUtilities.cs b/src/Avalonia.Base/Utilities/TypeUtilities.cs index d85eb4cd76..39736ab389 100644 --- a/src/Avalonia.Base/Utilities/TypeUtilities.cs +++ b/src/Avalonia.Base/Utilities/TypeUtilities.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.ComponentModel; using System.Globalization; using System.Linq; using System.Reflection; @@ -188,6 +189,14 @@ namespace Avalonia.Utilities } } + var typeConverter = TypeDescriptor.GetConverter(to); + + if (typeConverter.CanConvertFrom(from) == true) + { + result = typeConverter.ConvertFrom(null, culture, value); + return true; + } + var cast = FindTypeConversionOperatorMethod(from, to, OperatorType.Implicit | OperatorType.Explicit); if (cast != null) diff --git a/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs b/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs index ecf559951a..f29dabb6bf 100644 --- a/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs @@ -50,6 +50,18 @@ namespace Avalonia.Base.UnitTests.Data.Converters Assert.Equal(TestEnum.Bar, result); } + [Fact] + public void Can_Convert_String_To_TimeSpan() + { + var result = DefaultValueConverter.Instance.Convert( + "00:00:10", + typeof(TimeSpan), + null, + CultureInfo.InvariantCulture); + + Assert.Equal(TimeSpan.FromSeconds(10), result); + } + [Fact] public void Can_Convert_Int_To_Enum() {