RecordCloner
RecordCloner<T> implements ICloner and IGraphCloner for record like classes and structs.
RecordCloner<MyRecord> cloner =
new RecordCloner<MyRecord>()
.SetReadOnly();
RecordCloner.Create(type) also creates cloner.
RecordCloner<MyRecord> cloner =
(RecordCloner<MyRecord>)
RecordCloner.Create(typeof(MyRecord))
.SetReadOnly();
.SetClonerProvider(IProvider<Type, object>) assigns cloner provider for fields for deep cloning.
RecordCloner<MyRecord> cloner =
new RecordCloner<MyRecord>()
.SetClonerProvider(ClonerProvider.Cached)
.SetReadOnly();
Record can be cloned.
// Create cloner
RecordCloner<MyRecord> cloner = new RecordCloner<MyRecord>();
// Create record
MyRecord record1 = new MyRecord(1);
// Clone record
MyRecord clone = cloner.Clone(record1);
public record MyRecord(int Id) : IRecord;
.SetCyclical(true) marks cloner for cyclical records. The ClonerProvider implementation requires the record to have IRecord and ICyclical interfaces.
// Create cloner
RecordCloner<Node> cloner =
new RecordCloner<Node>()
.SetCyclical(true)
.SetClonerProvider(ClonerProvider.Cached)
.SetReadOnly();
// Create graph
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
node1.Edges.Add(node2);
node2.Edges.Add(node3);
node3.Edges.Add(node1);
// Clone graph
Node clone1 = cloner.Clone(node1);
// Compare object references
WriteLine(clone1 == node1); // false
public class Node : IRecord, ICyclical
{
/// <summary>Is possibly cyclical node.</summary>
[IgnoreDataMember] public bool IsCyclical { get => Edges.Count > 0; set { } }
public readonly int Id;
public List<Node> Edges = new List<Node>();
public Node(int id) => Id = id;
}
Full Example
Full example
using System.Collections.Generic;
using System.Runtime.Serialization;
using Avalanche.Utilities;
using Avalanche.Utilities.Record;
using static System.Console;
public class recordcloner
{
public static void Run()
{
{
// <01>
RecordCloner<MyRecord> cloner =
new RecordCloner<MyRecord>()
.SetReadOnly();
// </01>
}
{
// <02>
RecordCloner<MyRecord> cloner =
(RecordCloner<MyRecord>)
RecordCloner.Create(typeof(MyRecord))
.SetReadOnly();
// </02>
}
{
// <03>
RecordCloner<MyRecord> cloner =
new RecordCloner<MyRecord>()
.SetClonerProvider(ClonerProvider.Cached)
.SetReadOnly();
// </03>
}
{
// <04>
// Create cloner
RecordCloner<MyRecord> cloner = new RecordCloner<MyRecord>();
// Create record
MyRecord record1 = new MyRecord(1);
// Clone record
MyRecord clone = cloner.Clone(record1);
// </04>
}
{
// <11>
// Create cloner
RecordCloner<Node> cloner =
new RecordCloner<Node>()
.SetCyclical(true)
.SetClonerProvider(ClonerProvider.Cached)
.SetReadOnly();
// Create graph
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
node1.Edges.Add(node2);
node2.Edges.Add(node3);
node3.Edges.Add(node1);
// Clone graph
Node clone1 = cloner.Clone(node1);
// Compare object references
WriteLine(clone1 == node1); // false
// </11>
}
}
// <99>
public class Node : IRecord, ICyclical
{
/// <summary>Is possibly cyclical node.</summary>
[IgnoreDataMember] public bool IsCyclical { get => Edges.Count > 0; set { } }
public readonly int Id;
public List<Node> Edges = new List<Node>();
public Node(int id) => Id = id;
}
// </99>
// <98>
public record MyRecord(int Id) : IRecord;
// </98>
}