Единственный способ (который я знаю) сделать это и сделать это правильно, это реализовать копию самостоятельно.Возьмем для примера:
public class FrobAndState
{
public Frob Frobber { get; set;}
public bool State { get; set; }
}
public class Frob
{
public List<int> Values { get; private set; }
public Frob(int[] values)
{
Values = new List<int>(values);
}
}
В этом примере вам нужно знать , как реализован Frob, т.е. тот факт, что вам нужно вызвать конструктор, чтобы создать его копию какЗначения доступны только для чтения, чтобы иметь возможность сделать копию данного экземпляра FrobAndState.
Кроме того, вы не можете просто реализовать FrobAndState.Copy таким образом:
public class FrobAndState
{
// ... Properties
public FrobAndState Copy()
{
var new = new FrobAndState();
new.State = this.State;
new.Frobber = this.Frobber;
}
}
Поскольку обаэкземпляр FrobAndState, для которого вы вызвали .Copy (), и новый экземпляр будут иметь ссылку на один и тот же экземпляр Frobber.
Короче говоря, копирование - это hard и любойРеализовать копирование сложно.