Duplicator
The Duplicator tool provides methods to deep clone.
Example
A common scenario for this behavior is verifying a method doesn’t change the values of an instance:
/// <summary>Verifies that the method won't mutate the object.</summary>
[Theory, RandomData]
public void SomeMethod_ValuesUnchanged(DataSample original)
{
DataSample dupe = Tools.Duplicator.Copy(original);
SomeMethod(original);
Tools.Asserter.ValuesEqual(original, dupe);
}
Creation & Customization
The Duplicator requires an Asserter which verifies the created copy is equal to the original by value. Like other tools, custom CopyHint instances can be passed in to control behavior for any specific types. Alternatively, interfaces can be attached to the types that enable them to automatically work with the tool.
IDeepCloneable & IDuplicatable
These interfaces can be attached to objects and enable them to be used with the Duplicator. IDeepCloneable specifies the object can deep clone itself, and IDuplicatable specifies the object can deep clone itself with the help of the Duplicator (passed in as a parameter) for child objects.