using System.Collections.Generic;
using System.ComponentModel;
using Newtonsoft.Json.Linq;
public static void Main()
Window window = new Window();
Channel channel = new Channel();
channel.MeasClass = new IMDClass();
window.Channel1 = channel;
Channel channel2 = new Channel();
channel2.MeasClass = new NoiseFigureClass();
window.Channel2 = channel2;
var json = JsonConvert.SerializeObject(window);
JsonConverter[] converters = { new FooConverter() };
Window w = JsonConvert.DeserializeObject<Window>(json, new JsonSerializerSettings() { Converters = converters});
Console.WriteLine(w.Channel2.MeasClass.SetParams());
foreach(PropertyDescriptor descriptor in TypeDescriptor.GetProperties(w))
string name = descriptor.Name;
object value = descriptor.GetValue(w);
Console.WriteLine("{0}={1}", name, value);
public int WindowNumber {get; set;}
public Channel Channel1 {get; set;}
public Channel Channel2 {get; set;}
public int ChannelMember1 {get; set;}
public int ChannelMember2 {get; set;}
public MeasurementClass MeasClass {get; set;}
public abstract class MeasurementClass {
public string Name {get; set;}
public abstract string SetParams();
public class NoiseFigureClass : MeasurementClass
public NoiseFigureClass()
this.Name = "Noise Figure";
public override string SetParams()
return "Called from NoiseFigure";
public int MemberA {get; set;}
public int MemberB {get; set;}
public class IMDClass : MeasurementClass
public string QueryIMDShit()
return "queried imd shit";
public override string SetParams()
Console.WriteLine(this.QueryIMDShit());
return "Called from IMD";
public int MemberC {get; set;}
public int MemberD {get; set;}
public class FooConverter : JsonConverter
public override bool CanConvert(Type objectType)
return (objectType == typeof(MeasurementClass));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject jo = JObject.Load(reader);
if (jo["Name"].Value<string>() == "Noise Figure")
return jo.ToObject<NoiseFigureClass>(serializer);
if (jo["Name"].Value<string>() == "IMD")
return jo.ToObject<IMDClass>(serializer);
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();