private static object Clone(this object instance, VisitedGraph visited, object copy) { if (visited.ContainsKey(instance)) { return(visited[instance]); } else { visited.Add(instance, copy); } Type type = instance.GetType(); while (type != null) { foreach (FieldInfo field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { object value = field.GetValue(instance); if (visited.ContainsKey(value)) { field.SetValue(copy, visited[value]); } else { field.SetValue(copy, value.Clone(visited)); } } type = type.BaseType; } return(copy); }
private static object Clone(this object instance, VisitedGraph visited, object copy) { visited.Add(instance, copy); foreach ( FieldInfo field in instance.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { object value = field.GetValue(instance); if (visited.ContainsKey(value)) { field.SetValue(copy, visited[value]); } else { field.SetValue(copy, value.Clone(visited)); } } return(copy); }