From adca3fa96f8df6847c78cc69ded5356e9b5b2352 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Mon, 26 Jun 2017 19:58:15 +1200 Subject: [PATCH] -Fixed allowing static Specified properties --- .../Serialization/ContractResolverTests.cs | 11 +++++++++++ .../Serialization/DefaultContractResolver.cs | 4 ++-- Src/Newtonsoft.Json/Utilities/TypeExtensions.cs | 16 ++++++++++++++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs index 9b499ec8..92b36142 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs @@ -701,11 +701,14 @@ namespace Newtonsoft.Json.Tests.Serialization public string Prop3 { get; set; } [JsonProperty] public string Prop4 { get; set; } + [JsonProperty] + public string Prop5 { get; set; } public bool Prop1Specified; public bool Prop2Specified { get; set; } public static bool Prop3Specified { get; set; } public event System.Func Prop4Specified; + public static bool Prop5Specified; protected virtual bool OnProp4Specified() { @@ -736,6 +739,10 @@ namespace Newtonsoft.Json.Tests.Serialization var property4 = contract.Properties["Prop4"]; Assert.AreEqual(null, property4.GetIsSpecified); Assert.AreEqual(null, property4.SetIsSpecified); + + var property5 = contract.Properties["Prop5"]; + Assert.AreEqual(null, property5.GetIsSpecified); + Assert.AreEqual(null, property5.SetIsSpecified); } [Test] @@ -760,6 +767,10 @@ namespace Newtonsoft.Json.Tests.Serialization var property4 = contract.Properties["Prop4"]; Assert.AreEqual(null, property4.GetIsSpecified); Assert.AreEqual(null, property4.SetIsSpecified); + + var property5 = contract.Properties["Prop5"]; + Assert.AreEqual(null, property5.GetIsSpecified); + Assert.AreEqual(null, property5.SetIsSpecified); } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs index cff79324..6b68d9f0 100644 --- a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs +++ b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs @@ -1602,10 +1602,10 @@ namespace Newtonsoft.Json.Serialization private void SetIsSpecifiedActions(JsonProperty property, MemberInfo member, bool allowNonPublicAccess) { - MemberInfo specifiedMember = member.DeclaringType.GetProperty(member.Name + JsonTypeReflector.SpecifiedPostfix); + MemberInfo specifiedMember = member.DeclaringType.GetProperty(member.Name + JsonTypeReflector.SpecifiedPostfix, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (specifiedMember == null) { - specifiedMember = member.DeclaringType.GetField(member.Name + JsonTypeReflector.SpecifiedPostfix); + specifiedMember = member.DeclaringType.GetField(member.Name + JsonTypeReflector.SpecifiedPostfix, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } if (specifiedMember == null || ReflectionUtils.GetMemberUnderlyingType(specifiedMember) != typeof(bool)) diff --git a/Src/Newtonsoft.Json/Utilities/TypeExtensions.cs b/Src/Newtonsoft.Json/Utilities/TypeExtensions.cs index b7e1a7f3..46c57f9a 100644 --- a/Src/Newtonsoft.Json/Utilities/TypeExtensions.cs +++ b/Src/Newtonsoft.Json/Utilities/TypeExtensions.cs @@ -345,7 +345,13 @@ namespace Newtonsoft.Json.Utilities public static MemberInfo GetField(this Type type, string member, BindingFlags bindingFlags) { - return type.GetTypeInfo().GetDeclaredField(member); + MemberInfo field = type.GetTypeInfo().GetDeclaredField(member); + if (field == null || !TestAccessibility(field, bindingFlags)) + { + return null; + } + + return field; } public static IEnumerable GetProperties(this Type type, BindingFlags bindingFlags) @@ -426,7 +432,13 @@ namespace Newtonsoft.Json.Utilities public static PropertyInfo GetProperty(this Type type, string name, BindingFlags bindingFlags) { - return type.GetTypeInfo().GetDeclaredProperty(name); + PropertyInfo property = type.GetTypeInfo().GetDeclaredProperty(name); + if (property == null || !TestAccessibility(property, bindingFlags)) + { + return null; + } + + return property; } public static IEnumerable GetFields(this Type type)