An answer from a different thread that using json serialization is the best I've seen.
public static T CloneJson(this T source)
{
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source));
}