use newtonsoft json to clone object
// 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);
}
}