using Newtonsoft.Json.Linq;
using System.Collections;
using System.Collections.Generic;
public static void Main()
var p1 = new Person(){ Id = 1, FirstName = "Thanh" };
var p2 = new Person(){ Id = 1, LastName = "Truong Duc", Roles = new List<string>(){ "User" } };
MergeObject<Person>(p1, p2, out p3);
Console.WriteLine(JsonConvert.SerializeObject(p3));
private static void MergeObject<T>(T obj1, T obj2, out T obj)
var properties = typeof(T).GetProperties();
var objDefault = Activator.CreateInstance<T>();
obj = Activator.CreateInstance<T>();
foreach (var prop in properties)
var propValueDefault = prop.GetValue(objDefault);
var propValue = prop.GetValue(obj1);
Console.WriteLine(typeof(IEnumerable).IsAssignableFrom(prop.PropertyType));
if(prop.PropertyType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(prop.PropertyType))
var propObj2Value = prop.GetValue(obj2) as IList;
if (propObj2Value != null)
propValue = propObj2Value;
Console.WriteLine(JsonConvert.SerializeObject(propObj2Value));
Console.WriteLine(JsonConvert.SerializeObject(propValue));
foreach (var item in propObj2Value)
(propValue as IList).Add(item);
Console.WriteLine(JsonConvert.SerializeObject(propValue));
if(propValue == propValueDefault)
propValue = prop.GetValue(obj2);
prop.SetValue(obj, propValue);
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public List<string> Roles {get;set;}
class PersonConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(Person);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
Person person = (Person)value;
JObject result = new JObject();
result.Add("id", person.Id);
result.Add("fullname", (person.FirstName + " " + person.LastName).Trim());
result.Add("address", (person.Address1 + " " + person.Address2).Trim());
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject obj = JObject.Load(reader);
Person person = new Person();
person.Id = (int)obj["id"];
string fullName = (string)obj["fullname"];
string[] parts = fullName.Split(new char[] { ' ' }, 2);
person.FirstName = parts[0];
person.LastName = parts[1];
person.Address1 = (string)obj["address"];