IFieldDelegates
IFieldDelegates contains read, write and recreate delegates for a field. (namespace Avalanche.Utilities.Record).
/// <summary>Field delegates</summary>
public interface IFieldDelegates
{
/// <summary>Record Type of delegates</summary>
Type RecordType { get; set; }
/// <summary>Field Type of delegates</summary>
Type FieldType { get; set; }
/// <summary>Read value</summary>
Delegate? FieldRead { get; set; }
/// <summary>Assign new value</summary>
Delegate? FieldWrite { get; set; }
/// <summary>Create new instance of record with new value.</summary>
Delegate? RecreateWith { get; set; }
/// <summary></summary>
IFieldDescription? FieldDescription { get; set; }
}
/// <summary>Field delegates</summary>
public interface IFieldDelegates<Record> : IFieldDelegates { }
/// <summary>Field delegates</summary>
public interface IFieldDelegates<Record, Field> : IFieldDelegates<Record>
{
/// <summary>Read field value</summary>
new FieldRead<Record, Field>? FieldRead { get; set; }
/// <summary>Assign new value to newValue.</summary>
new FieldWrite<Record, Field>? FieldWrite { get; set; }
/// <summary>Create new instance of record with newValue.</summary>
new RecreateWith<Record, Field>? RecreateWith { get; set; }
}
FieldDelegates is the default implementation.
IFieldDelegates<MyClass, int> fieldDelegates =
new FieldDelegates<MyClass, int>
{
FieldRead = null,
FieldWrite = null,
RecreateWith = null,
FieldDescription = null
}.SetReadOnly();
There is a setter method for each field.
IFieldDelegates fieldDelegates =
FieldDelegates
.Create(typeof(MyClass), typeof(int))
.SetFieldRead(null)
.SetFieldWrite(null)
.SetRecreateWith(null)
.SetFieldDescription(null)
.SetReadOnly();
.Clone() makes a copy.
IFieldDelegates clone = fieldDelegates.Clone().SetReadOnly();
.CreateFieldDelegates() and .CreateFieldDelegates<Record, Field>() creates delegates for the field.
// Choose field
FieldInfo fi = typeof(MyClass).GetField("value")!;
// Create record description
IRecordDescription recordDescription =
new RecordDescription()
.Read(typeof(MyClass))
.AssignConstructors()
.ChooseConstruction()
.SetReadOnly();
// Create field description
IFieldDescription fieldDescription =
recordDescription
.Fields
.GetByName("value");
// Create delegates
IFieldDelegates<MyClass, int> fieldDelegates =
fieldDescription
.CreateFieldDelegates<MyClass, int>()
.SetReadOnly();
Delegates can be used to read, write field and recreate record with new values for the field.
// Create
MyClass myClass = new MyClass(0);
// Write
fieldDelegates.FieldWrite!(ref myClass, 5);
// Read
int value = fieldDelegates.FieldRead!(ref myClass);
// Recreate new MyClass instance
fieldDelegates.RecreateWith!(ref myClass, 10);
public class MyClass
{
[DataMember(Order = 1)]
public int value;
public MyClass(int value)
{
this.value = value;
}
}
Full Example
Full example
using System.Reflection;
using System.Runtime.Serialization;
using Avalanche.Utilities;
using Avalanche.Utilities.Record;
class fielddelegates
{
public static void Run()
{
{
// <01>
IFieldDelegates<MyClass, int> fieldDelegates =
new FieldDelegates<MyClass, int>
{
FieldRead = null,
FieldWrite = null,
RecreateWith = null,
FieldDescription = null
}.SetReadOnly();
// </01>
}
{
// <02>
IFieldDelegates fieldDelegates =
FieldDelegates
.Create(typeof(MyClass), typeof(int))
.SetFieldRead(null)
.SetFieldWrite(null)
.SetRecreateWith(null)
.SetFieldDescription(null)
.SetReadOnly();
// </02>
// <03>
IFieldDelegates clone = fieldDelegates.Clone().SetReadOnly();
// </03>
}
{
// <04>
// Choose field
FieldInfo fi = typeof(MyClass).GetField("value")!;
// Create record description
IRecordDescription recordDescription =
new RecordDescription()
.Read(typeof(MyClass))
.AssignConstructors()
.ChooseConstruction()
.SetReadOnly();
// Create field description
IFieldDescription fieldDescription =
recordDescription
.Fields
.GetByName("value");
// Create delegates
IFieldDelegates<MyClass, int> fieldDelegates =
fieldDescription
.CreateFieldDelegates<MyClass, int>()
.SetReadOnly();
// </04>
// <05>
// Create
MyClass myClass = new MyClass(0);
// Write
fieldDelegates.FieldWrite!(ref myClass, 5);
// Read
int value = fieldDelegates.FieldRead!(ref myClass);
// Recreate new MyClass instance
fieldDelegates.RecreateWith!(ref myClass, 10);
// </05>
}
}
// <10>
public class MyClass
{
[DataMember(Order = 1)]
public int value;
public MyClass(int value)
{
this.value = value;
}
}
// </10>
}