У меня есть класс с ObservableCollection
и другими свойствами. Так это выглядит немного как это:Clone ObservableCollection
public class A
{
public int Id { get; set; }
...
public object AValue {get; set;}
}
Я хотел бы клон объекта этого класса. AValue
Недвижимость может быть ObservableCollection
или другим объектом. Когда AValue
имеет тип ObservableCollection, и я пытаюсь добавить к нему некоторый объект, кажется, что клон имеет тот же объект, что и оригинал. Если я использую свой метод clone только для AValue
Свойство, а не объект класса A
, он работает. Для клонирования объектов я пытался использовать:
private object Clone(object obj)
{
var t = obj.GetType();
if (obj == null)
return null;
if (t.IsValueType || t == typeof(string))
{
return obj;
}
else if (t.IsGenericType)
{
if (obj is IList)
{
var c= typeof(ObservableCollection<>);
var cType = type.GetGenericArguments().First();
var gType = c.MakeGenericType(cType);
var newC = (IList)Activator.CreateInstance(gType);
foreach (var item in (IEnumerable)obj)
newC.Add(item);
return newC;
}
}
else if (t.IsClass)
{
object objV = Activator.CreateInstance(type);
FieldInfo[] fields = t.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
object fieldV = field.GetValue(obj);
if (fieldValue == null)
continue;
field.SetValue(objV, Clone(fieldV));
}
return obj;
}
throw new ArgumentException("Unknown type");
}
}
Редактировать спасибо за ответ. Я добавил ваш код @Sefe, но он все еще не работает. Я знаю, что другие типы не клонируются, но я бы хотел сделать это со списками в первую очередь. Я не знаю, где ошибка. Я получаю объект класса A, затем я клонирую объект и отправляю объект класса в диалоговое окно. Я меняю коллекцию, и свойства от клона и оригинала одинаковы. Это прийти, чтобы добавить IClonable интерфейса общего типа списка
ObservableCollection<B> = new ObservableCollection<B>();
public class B: Base, ICloneable
{
...
public object Clone()
{
return this.MemberwiseClone();
}
}
Важен, что общий тип может наследовать от другого класса?
У вас есть возможная ошибка в коде. Что относительно общих типов, которые не являются списками? Они не будут клонированы. – Sefe
@Sefe Я тоже наткнулся на это, но в этом случае выбрано исключение, которое прекрасно (возможно, это может быть NotImplementedException, но все же). –