From be8ca7a8707de8be80db91e06e51537cd603b69f Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 27 Nov 2016 13:58:21 +1300 Subject: [PATCH] -Refactor --- .../Serialization/JsonSerializerTest.cs | 3 +++ .../Utilities/ReflectionUtils.cs | 24 +++++++++---------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 180d640b..8bdbf7bc 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -9799,6 +9799,9 @@ Path '', line 1, position 1."); [Test] public void ChildClassWithProtectedOverridePlusJsonProperty_Serialize() { + JsonObjectContract c = (JsonObjectContract)DefaultContractResolver.Instance.ResolveContract(typeof(ChildClassWithProtectedOverridePlusJsonProperty)); + Assert.AreEqual(1, c.Properties.Count); + var propertyValue = "test"; var testJson = @"{ 'MyProperty' : '" + propertyValue + "' }"; diff --git a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs index 55a0d4e4..9f27f636 100644 --- a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs @@ -117,13 +117,13 @@ namespace Newtonsoft.Json.Utilities { ValidationUtils.ArgumentNotNull(propertyInfo, nameof(propertyInfo)); - MethodInfo m = propertyInfo.GetGetMethod(); + MethodInfo m = propertyInfo.GetGetMethod(true); if (m != null) { return m.GetBaseDefinition(); } - m = propertyInfo.GetSetMethod(); + m = propertyInfo.GetSetMethod(true); if (m != null) { return m.GetBaseDefinition(); @@ -1054,18 +1054,16 @@ namespace Newtonsoft.Json.Utilities } else { - MethodInfo subTypePropertyBaseDefinition = subTypeProperty.GetBaseDefinition(); - if (subTypePropertyBaseDefinition != null) - { - int index = initialProperties.IndexOf(p => p.Name == subTypeProperty.Name - && p.IsVirtual() - && p.GetBaseDefinition() != null - && p.GetBaseDefinition().DeclaringType.IsAssignableFrom(subTypePropertyBaseDefinition.DeclaringType)); + Type subTypePropertyDeclaringType = subTypeProperty.GetBaseDefinition()?.DeclaringType ?? subTypeProperty.DeclaringType; - if (index == -1) - { - initialProperties.Add(subTypeProperty); - } + int index = initialProperties.IndexOf(p => p.Name == subTypeProperty.Name + && p.IsVirtual() + && (p.GetBaseDefinition()?.DeclaringType ?? p.DeclaringType).IsAssignableFrom(subTypePropertyDeclaringType)); + + // don't add a virtual property that has an override + if (index == -1) + { + initialProperties.Add(subTypeProperty); } } }