From f3706313ef68d4ce968081d080f07a6d86393e43 Mon Sep 17 00:00:00 2001 From: Dmitry Kalyanov Date: Fri, 27 Nov 2015 15:58:15 +0300 Subject: [PATCH] Compare BaseDefinition for properties when adding private properties. Due to difference in mono vs .net (see https://bugzilla.xamarin.com/show_bug.cgi?id=36305), MethodInfo.GetBaseDefinition() does not actually return base class (it returns partially-instantiated generic class) in mono when overriding property from generic base class. Because of this, lookup of matching property in ReflectionUtils.GetChildPrivateProperties() fails to find already added property and adds the same property multiple times. Comparing GetBaseDefinition()'s compensates for this: since the same function is applied to both PropertyInfo's, matching property will be found. This fixes issue #726. --- Src/Newtonsoft.Json.Tests/JsonConvertTest.cs | 11 +++++++++++ Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs b/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs index 6c6a1a05..1244b05f 100644 --- a/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonConvertTest.cs @@ -1399,5 +1399,16 @@ namespace Newtonsoft.Json.Tests writer.WriteValue(Math.Round((double)value, _precision, _rounding)); } } + + [Test] + public void GenericBaseClassSerialization() + { + string json = JsonConvert.SerializeObject (new NonGenericChildClass ()); + Assert.AreEqual ("{\"Data\":null}", json); + } + + public class GenericBaseClass { public virtual T Data { get; set; } } + public class GenericIntermediateClass : GenericBaseClass { public override string Data { get; set; } } + public class NonGenericChildClass : GenericIntermediateClass { } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs index cf22842a..89ed5bd6 100644 --- a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs @@ -967,7 +967,7 @@ namespace Newtonsoft.Json.Utilities int index = initialProperties.IndexOf(p => p.Name == subTypeProperty.Name && p.IsVirtual() && p.GetBaseDefinition() != null - && p.GetBaseDefinition().DeclaringType.IsAssignableFrom(subTypeProperty.DeclaringType)); + && p.GetBaseDefinition().DeclaringType.IsAssignableFrom(subTypeProperty.GetBaseDefinition().DeclaringType)); if (index == -1) initialProperties.Add(subTypeProperty);