Not the most elegant solution, but you can extend DefaultConstractResolver to do this:
public class ContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); property.Writable = CanSetMemberValue(member, true); return property; } public static bool CanSetMemberValue(MemberInfo member, bool nonPublic) { switch (member.MemberType) { case MemberTypes.Field: var fieldInfo = (FieldInfo)member; return nonPublic || fieldInfo.IsPublic; case MemberTypes.Property: var propertyInfo = (PropertyInfo)member; if (!propertyInfo.CanWrite) return false; if (nonPublic) return true; return (propertyInfo.GetSetMethod(nonPublic) != null); default: return false; } } }
I will simply remove one small check from the CanSetMemberValue method. Unfortunately, this was neither a virtual nor an instance method, so I had to override CreateProperty.
asgerhallas
source share