use newtonsoft json to clone object

C#
// using Newtonsoft.Json;

// This sample is from the StackOverflow response (source cited) with
// a couple of modifications
public static T Clone<T>(T source)
{
  	var jsonSettings = new Newtonsoft.Json.JsonSerializerSettings() {
    	// Use this option to ignore reference looping option
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
      	// Use this option when properties use an Interface as the type
      	TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All
    };
    var serialized = JsonConvert.SerializeObject(source, jsonSettings);
    return JsonConvert.DeserializeObject<T>(serialized, jsonSettings);
}

/* For System Extension Method */

public static class SystemExtension
{
    public static T Clone<T>(this T source)
    {
        var jsonSettings = new Newtonsoft.Json.JsonSerializerSettings() {
            // Use this option to ignore reference looping option
            ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
            // Use this option when properties use an Interface as the type
            TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All
        };
        var serialized = JsonConvert.SerializeObject(source, jsonSettings);
        return JsonConvert.DeserializeObject<T>(serialized, jsonSettings);
    }
}
Source

Also in C#: