using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class CommandResponse
protected string jsonTestProtected;
protected string jsonTestProtectedGetOnlyProperty => jsonTestProtected;
protected string jsonTestProtectedSetOnlyProperty { set { jsonTestProtected = value; } }
[JsonIgnore] public string AmIIgnored => throw new NotImplementedException();
public CommandResponse(string jsonTestProtected) => this.jsonTestProtected = jsonTestProtected;
class CommandActionInvalid : CommandResponse
public CommandActionInvalid(string jsonTestProtected): base(jsonTestProtected) { }
private string jsonTestPrivate { get; set; } = "child-class";
static IContractResolver resolver = new CustomJsonContractResolver();
public static void Test()
var cmd = new CommandActionInvalid("Attr from parent class");
var settings = new JsonSerializerSettings
ContractResolver = resolver,
var json = JsonConvert.SerializeObject(cmd, Formatting.Indented, settings);
class CustomJsonContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
const BindingFlags allInstanceMembersFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy;
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
IEnumerable<MemberInfo> fields =
objectType.GetFields(allInstanceMembersFlags)
.Where(fi => !fi.IsDefined(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute)));
IEnumerable<MemberInfo> props = objectType.GetProperties(allInstanceMembersFlags)
.Where(pi => pi.GetIndexParameters().Length == 0);
return fields.Concat(props).ToList();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
return base.CreateProperty(fi, MemberSerialization.Fields);
var jsonProperty = base.CreateProperty(pi, memberSerialization);
if (pi.GetGetMethod(true) != null)
jsonProperty.Readable = true;
if (pi.GetSetMethod(true) != null)
jsonProperty.Writable = true;
return base.CreateProperty(member, memberSerialization);
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Assembly.GetName().Name, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.Location.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];