FieldCloner
FieldCloner<Record, Field> creates a new field cloner.
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetReadOnly();
FieldCloner copies field value from one record to another.
// Create records
MyRecord myRecord1 = new MyRecord { Name = "ABC" };
MyRecord myRecord2 = new MyRecord();
// Copy field value
cloner.CloneField(ref myRecord1, ref myRecord2);
public record MyRecord
{
public string Name = null!;
}
FieldCloner.Create(recordType, valueType) instantiates a field cloner using type arguments.
FieldCloner<MyRecord, string> cloner =
(FieldCloner<MyRecord, string>)
FieldCloner.Create(typeof(MyRecord), typeof(string))
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetReadOnly();
Func<Record, Value> can be assigned as reader.
// Create delegate
Func<MyRecord, string> reader = (MyRecord record) => record.Name;
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader(reader);
And FieldRead<Record, Value>. FieldRead is better for reading structs.
// Create record description
IRecordDescription recordDescription = RecordDescription.Cached[typeof(MyRecord)];
// Create delegate
FieldRead<MyRecord, string> reader =
(FieldRead<MyRecord, string>)
FieldRead.Cached[recordDescription.Fields[0]];
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader(reader);
Action<Record, Value> can be assigned for writer.
// Create delegate
Action<MyRecord, string> writer = (MyRecord record, string value) => { record.Name = value; };
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetWriter(writer);
And FieldWrite<Record, Value>. FieldWrite is needed for writing to structs.
// Create record description
IRecordDescription recordDescription = RecordDescription.Cached[typeof(MyRecord)];
// Create delegate
FieldWrite<MyRecord, string> reader =
(FieldWrite<MyRecord, string>)
FieldWrite.Cached[recordDescription.Fields[0]];
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetWriter(reader);
Deep clone
.SetCloner(ICloner) assigns a cloner that copies values. This allows deep clones.
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetCloner(PassthroughCloner<string>.Instance)
.SetReadOnly();
.SetClonerProvider(IProvider<Type, ICloner>) assigns a cloner provider that creates cloner that copies values. This allows deep clones.
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetClonerProvider(ClonerProvider.Cached)
.SetReadOnly();
Full Example
Full example
using System;
using Avalanche.Utilities;
using Avalanche.Utilities.Record;
class fieldcloner
{
public static void Run()
{
{
// <01>
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetReadOnly();
// </01>
// <02>
// Create records
MyRecord myRecord1 = new MyRecord { Name = "ABC" };
MyRecord myRecord2 = new MyRecord();
// Copy field value
cloner.CloneField(ref myRecord1, ref myRecord2);
// </02>
}
{
// <03>
FieldCloner<MyRecord, string> cloner =
(FieldCloner<MyRecord, string>)
FieldCloner.Create(typeof(MyRecord), typeof(string))
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetReadOnly();
// </03>
// Create records
MyRecord myRecord1 = new MyRecord { Name = "ABC" };
MyRecord myRecord2 = new MyRecord();
// Copy field value
cloner.CloneField(ref myRecord1, ref myRecord2);
}
{
// <04>
// Create delegate
Func<MyRecord, string> reader = (MyRecord record) => record.Name;
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader(reader);
// </04>
}
{
// <05>
// Create record description
IRecordDescription recordDescription = RecordDescription.Cached[typeof(MyRecord)];
// Create delegate
FieldRead<MyRecord, string> reader =
(FieldRead<MyRecord, string>)
FieldRead.Cached[recordDescription.Fields[0]];
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader(reader);
// </05>
}
{
// <06>
// Create delegate
Action<MyRecord, string> writer = (MyRecord record, string value) => { record.Name = value; };
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetWriter(writer);
// </06>
}
{
// <07>
// Create record description
IRecordDescription recordDescription = RecordDescription.Cached[typeof(MyRecord)];
// Create delegate
FieldWrite<MyRecord, string> reader =
(FieldWrite<MyRecord, string>)
FieldWrite.Cached[recordDescription.Fields[0]];
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetWriter(reader);
// </07>
}
{
// <11>
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetCloner(PassthroughCloner<string>.Instance)
.SetReadOnly();
// </11>
//
MyRecord myRecord1 = new MyRecord { Name = "ABC" };
MyRecord myRecord2 = new MyRecord();
// Copy field value
cloner.CloneField(ref myRecord1, ref myRecord2);
}
{
// <12>
// Create cloner
FieldCloner<MyRecord, string> cloner =
new FieldCloner<MyRecord, string>()
.SetReader((MyRecord record) => record.Name)
.SetWriter((MyRecord record, string value) => { record.Name = value; })
.SetClonerProvider(ClonerProvider.Cached)
.SetReadOnly();
// </12>
//
MyRecord myRecord1 = new MyRecord { Name = "ABC" };
MyRecord myRecord2 = new MyRecord();
// Copy field value
cloner.CloneField(ref myRecord1, ref myRecord2);
}
}
// <99>
public record MyRecord
{
public string Name = null!;
}
// </99>
}