From 56af2878e6c4f47c197617f7e8735c09d365b535 Mon Sep 17 00:00:00 2001 From: Rob Horvath Date: Mon, 3 Dec 2012 15:59:16 -0500 Subject: [PATCH] Fix for Issue #131 BindingTypeConverters EqualityTypeConverter.DoReferenceCast doesn't handle nullable values --- ReactiveUI.Tests/BindingTypeConvertersTest.cs | 23 +++++++++++++++++++ ReactiveUI.Tests/ReactiveUI.Tests.csproj | 3 ++- ReactiveUI/BindingTypeConverters.cs | 20 ++++++++-------- 3 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 ReactiveUI.Tests/BindingTypeConvertersTest.cs diff --git a/ReactiveUI.Tests/BindingTypeConvertersTest.cs b/ReactiveUI.Tests/BindingTypeConvertersTest.cs new file mode 100644 index 0000000000..ada9ab4034 --- /dev/null +++ b/ReactiveUI.Tests/BindingTypeConvertersTest.cs @@ -0,0 +1,23 @@ +using Xunit; + +namespace ReactiveUI.Tests +{ + public class BindingTypeConvertersTest + { + [Fact] + public void EqualityTypeConverterDoReferenceCastShouldConvertNullableValues() + { + double? nullableDouble = 0.0; + var result = EqualityTypeConverter.DoReferenceCast(nullableDouble); + Assert.Equal(nullableDouble, result); + } + + [Fact] + public void EqualityTypeConverterDoReferenceCastShouldConvertValueTypes() + { + double doubleValue = 0.0; + var result = EqualityTypeConverter.DoReferenceCast(doubleValue); + Assert.Equal(doubleValue, result); + } + } +} \ No newline at end of file diff --git a/ReactiveUI.Tests/ReactiveUI.Tests.csproj b/ReactiveUI.Tests/ReactiveUI.Tests.csproj index 1c7d6a9809..c2a1f68b2f 100644 --- a/ReactiveUI.Tests/ReactiveUI.Tests.csproj +++ b/ReactiveUI.Tests/ReactiveUI.Tests.csproj @@ -93,6 +93,7 @@ + @@ -134,4 +135,4 @@ --> - + \ No newline at end of file diff --git a/ReactiveUI/BindingTypeConverters.cs b/ReactiveUI/BindingTypeConverters.cs index cfdd623e9e..c86e564bbc 100644 --- a/ReactiveUI/BindingTypeConverters.cs +++ b/ReactiveUI/BindingTypeConverters.cs @@ -42,16 +42,18 @@ public bool TryConvert(object from, Type toType, object conversionHint, out obje public static object DoReferenceCast(object from) { -#if WINRT - bool isValueType = typeof (T).GetTypeInfo().IsValueType; -#else - bool isValueType = typeof (T).IsValueType; -#endif - if (isValueType) { - return System.Convert.ChangeType(from, typeof (T), null); - } else { - return (T) from; + var t = typeof (T); + var u = Nullable.GetUnderlyingType(t); + + if (u == null) { + return (T) Convert.ChangeType(from, t); } + + if (from == null) { + return default(T); + } + + return (T) Convert.ChangeType(from, u); } }