ClonerProvider
ClonerProvider.Create is a simple provider that creates cloners.
IProvider<Type, ICloner> clonerProvider = ClonerProvider.Create;
ClonerProvider.Cached is a simple provoder that creates and caches cloners in a weak keyed hash table.
IProvider<Type, ICloner> clonerProvider = ClonerProvider.Cached;
Cloner can be created for an array.
ICloner<int[]> cloner = (ICloner<int[]>)ClonerProvider.Create[typeof(int[])];
int[] clone = cloner.Clone(new int[] { 1, 2, 3 });
Cloner can be created for abstract array.
ICloner<IList<int>> cloner = (ICloner<IList<int>>)ClonerProvider.Cached[typeof(IList<int>)];
IList<int> clone = cloner.Clone(new int[] { 1, 2, 3 });
Classes must implement IRecord to indicate that they are to be cloned as records.
ICloner<MyRecord> cloner = (ICloner<MyRecord>)ClonerProvider.Cached[typeof(MyRecord)];
MyRecord clone = cloner.Clone(new MyRecord(1));
Cyclical graph classes must implement ICyclical and IRecord to indicate that they are to be cloned as cyclical records.
// Create cloner
ICloner<Node> cloner = (ICloner<Node>)ClonerProvider.Cached[typeof(Node)];
// 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);
For more intricate cases, a IService is better suited for constructing suitable cloners.
Full Example
Full example
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Avalanche.Utilities;
using Avalanche.Utilities.Provider;
using Avalanche.Utilities.Record;
public class clonerprovider
{
public static void Run()
{
{
// <01>
IProvider<Type, ICloner> clonerProvider = ClonerProvider.Create;
// </01>
}
{
// <02>
IProvider<Type, ICloner> clonerProvider = ClonerProvider.Cached;
// </02>
}
{
// <03>
ICloner<int[]> cloner = (ICloner<int[]>)ClonerProvider.Create[typeof(int[])];
int[] clone = cloner.Clone(new int[] { 1, 2, 3 });
// </03>
}
{
// <04>
ICloner<IList<int>> cloner = (ICloner<IList<int>>)ClonerProvider.Cached[typeof(IList<int>)];
IList<int> clone = cloner.Clone(new int[] { 1, 2, 3 });
// </04>
}
{
// <05>
ICloner<MyRecord> cloner = (ICloner<MyRecord>)ClonerProvider.Cached[typeof(MyRecord)];
MyRecord clone = cloner.Clone(new MyRecord(1));
// </05>
}
{
// <06>
// Create cloner
ICloner<Node> cloner = (ICloner<Node>)ClonerProvider.Cached[typeof(Node)];
// 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);
// </06>
}
}
// <99>
public class Node : IRecord, ICyclical
{
[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>
}