public bool AnyReferenceEquals(WeakReferenceTestObject other) { if (object.ReferenceEquals(this, other)) return true; if (object.ReferenceEquals(this.Parent, other.Parent) && !object.ReferenceEquals(this.Parent, null)) return true; if (object.ReferenceEquals(this.Children, other.Children) && !object.ReferenceEquals(this.Children, null)) return true; if (this.Children.Zip(other.Children, (a, b) => a.AnyReferenceEquals(b)).Contains(true)) return true; return false; }
void ICloneExplicit.CopyDataTo(object target, ICloneOperation operation) { operation.HandleObject(this, target); // If the source objects parent was cloned as well, assign its // cloned instance to our target object. WeakReferenceTestObject testTarget = target as WeakReferenceTestObject; testTarget.Parent = operation.GetWeakTarget(this.Parent); }
public bool AnyReferenceEquals(WeakReferenceTestObject other) { if (object.ReferenceEquals(this, other)) { return(true); } if (object.ReferenceEquals(this.Parent, other.Parent) && !object.ReferenceEquals(this.Parent, null)) { return(true); } if (object.ReferenceEquals(this.Children, other.Children) && !object.ReferenceEquals(this.Children, null)) { return(true); } if (this.Children.Zip(other.Children, (a, b) => a.AnyReferenceEquals(b)).Contains(true)) { return(true); } return(false); }
[Test] public void WeakReferenceBehavior() { WeakReferenceTestObject data = new WeakReferenceTestObject(new[] { new WeakReferenceTestObject(), new WeakReferenceTestObject(new[] { new WeakReferenceTestObject(), new WeakReferenceTestObject() }) }); WeakReferenceTestObject dataPart = data.Children[1]; // Clone the full graph and see if its complete { WeakReferenceTestObject dataResultFull = data.DeepClone(); Assert.AreSame(null, dataResultFull.Parent); Assert.AreEqual(2, dataResultFull.Children.Count); Assert.AreEqual(2, dataResultFull.Children[1].Children.Count); Assert.IsTrue(dataResultFull.CheckChildIntegrity()); Assert.IsFalse(data.AnyReferenceEquals(dataResultFull)); } // Clone part of the graph and see if the right parts are missing { WeakReferenceTestObject dataResultPart = dataPart.DeepClone(); Assert.AreSame(null, dataResultPart.Parent); Assert.AreEqual(2, dataResultPart.Children.Count); Assert.IsTrue(dataResultPart.CheckChildIntegrity()); Assert.IsFalse(dataPart.AnyReferenceEquals(dataResultPart)); } }