TypeCast
.TypeCast<From, To>() and .TypeCast(fromType, toType) type-casts writer 'From' and 'To' types with implicit type-casting.
If value types are casted into object, then caster refers inside box.
// Create reader
IWriterFromRefToRef<MyStruct, string> labelReader = DelegateWriter.Reader((ref MyStruct myStruct) => myStruct.Label);
// Create writer
IWriterFromRef<string, MyStruct> labelWriter = DelegateWriter.Writer((string label, ref MyStruct myStruct) => myStruct.Label = label);
// Convert to box reader
IWriterToRef<object, string> boxLabelReader =
(IWriterToRef<object, string>)
labelReader.TypeCast<object, string>();
// Convert to box writer
IWriter<string, object> boxLabelWriter =
(IWriter<string, object>)
labelWriter.TypeCast(typeof(string), typeof(object));
// Create struct
MyStruct myStruct = new MyStruct("Label");
// Copy to heap
object box = myStruct;
// Write to box
boxLabelWriter.Write("NewLabel", box);
// Read from box
string label = boxLabelReader.Read(box);
Cast
.CastFrom<NewFrom>(casterOldFromToNewFrom), .CastFrom(newFromType, casterOldFromToNewFrom) casts 'From' type by forwarding casting to sub-writer.
// Create Int32 parser
IWriterToRef<string, int> int32parser = DelegateWriter.Reader((string str) => int.Parse(str));
// Create Int32 printer
IWriterToRef<int, string> int32printer = DelegateWriter.Reader((int value) => value.ToString());
// Create writer
IWriterFromRef<string, MyStruct> labelWriter = DelegateWriter.Writer((string label, ref MyStruct myStruct) => myStruct.Label = label);
// Cast to int32 writer of Label:string on MyStruct
IWriterFromRefToRef<int, MyStruct> labelIntWriter =
(IWriterFromRefToRef<int, MyStruct>)
labelWriter.CastFrom(typeof(int), int32printer, int32parser);
// Create struct
MyStruct myStruct = new MyStruct("100");
// Write label with integer
labelIntWriter.Write(200, ref myStruct);
.CastTo<NewTo>(casterOldToToNewTo, casterNewToToOldTo?), .CastTo(newToType, casterOldToToNewTo, casterNewToToOldTo?) casts 'To' type.
// Create Int32 parser
IWriterToRef<string, int> int32parser = DelegateWriter.Reader((string str) => int.Parse(str));
// Create Int32 printer
IWriterToRef<int, string> int32printer = DelegateWriter.Reader((int value) => value.ToString());
// Create reader
IWriterFromRefToRef<MyStruct, string> labelReader = DelegateWriter.Reader((ref MyStruct myStruct) => myStruct.Label);
// Cast to int32 reader of Label:string on MyStruct
IWriterFromRefToRef<MyStruct, int> labelIntReader =
(IWriterFromRefToRef<MyStruct, int>)
labelReader.CastTo(typeof(int), int32parser, int32printer);
// Create struct
MyStruct myStruct = new MyStruct("100");
// Read label as integer
int label = labelIntReader.Read(ref myStruct);
.CastFromAndTo<NewFrom, NewTo>() type-casts writer 'From' and 'To' types by forwarding casting to a sub-writers.
// Create Int32 parser
IWriterToRef<string, int> int32parser = DelegateWriter.Reader((string str) => int.Parse(str));
// Create Int32 printer
IWriterToRef<int, string> int32printer = DelegateWriter.Reader((int value) => value.ToString());
// Create Boxer
IWriterToRef<object, MyStruct> myStructUnboxer = (IWriterToRef<object, MyStruct>)TypeCastT.Create<object, MyStruct>();
// Create Unboxer
IWriterToRef<MyStruct, object> myStructBoxer = (IWriterToRef<MyStruct, object>)TypeCastT.Create<MyStruct, object>();
// Create writer
IWriterFromRef<string, MyStruct> labelWriter = DelegateWriter.Writer((string label, ref MyStruct myStruct) => myStruct.Label = label);
//
IWriterToRef<int, object> boxLabelIntWriter =
(IWriterToRef<int, object>)
labelWriter.CastFromAndTo(
newFrom: typeof(int),
newTo: typeof(object),
casterNewFromToOldFrom: int32printer,
casterOldToToNewTo: myStructBoxer,
casterNewToToOldTo: myStructUnboxer,
casterOldFromToNewFrom: int32parser);
// Create struct
MyStruct myStruct = new MyStruct("100");
// Box it
object box = myStruct;
// Writer label as integer
boxLabelIntWriter.Write(25, ref box);
Full Example
Full example
using Avalanche.Service;
using Avalanche.Writer;
public class typecast
{
public static void Run()
{
{
// <01>
// Create reader
IWriterFromRefToRef<MyStruct, string> labelReader = DelegateWriter.Reader((ref MyStruct myStruct) => myStruct.Label);
// Create writer
IWriterFromRef<string, MyStruct> labelWriter = DelegateWriter.Writer((string label, ref MyStruct myStruct) => myStruct.Label = label);
// Convert to box reader
IWriterToRef<object, string> boxLabelReader =
(IWriterToRef<object, string>)
labelReader.TypeCast<object, string>();
// Convert to box writer
IWriter<string, object> boxLabelWriter =
(IWriter<string, object>)
labelWriter.TypeCast(typeof(string), typeof(object));
// Create struct
MyStruct myStruct = new MyStruct("Label");
// Copy to heap
object box = myStruct;
// Write to box
boxLabelWriter.Write("NewLabel", box);
// Read from box
string label = boxLabelReader.Read(box);
// </01>
}
{
// <11>
// Create Int32 parser
IWriterToRef<string, int> int32parser = DelegateWriter.Reader((string str) => int.Parse(str));
// Create Int32 printer
IWriterToRef<int, string> int32printer = DelegateWriter.Reader((int value) => value.ToString());
// Create writer
IWriterFromRef<string, MyStruct> labelWriter = DelegateWriter.Writer((string label, ref MyStruct myStruct) => myStruct.Label = label);
// Cast to int32 writer of Label:string on MyStruct
IWriterFromRefToRef<int, MyStruct> labelIntWriter =
(IWriterFromRefToRef<int, MyStruct>)
labelWriter.CastFrom(typeof(int), int32printer, int32parser);
// Create struct
MyStruct myStruct = new MyStruct("100");
// Write label with integer
labelIntWriter.Write(200, ref myStruct);
// </11>
}
{
// <12>
// Create Int32 parser
IWriterToRef<string, int> int32parser = DelegateWriter.Reader((string str) => int.Parse(str));
// Create Int32 printer
IWriterToRef<int, string> int32printer = DelegateWriter.Reader((int value) => value.ToString());
// Create reader
IWriterFromRefToRef<MyStruct, string> labelReader = DelegateWriter.Reader((ref MyStruct myStruct) => myStruct.Label);
// Cast to int32 reader of Label:string on MyStruct
IWriterFromRefToRef<MyStruct, int> labelIntReader =
(IWriterFromRefToRef<MyStruct, int>)
labelReader.CastTo(typeof(int), int32parser, int32printer);
// Create struct
MyStruct myStruct = new MyStruct("100");
// Read label as integer
int label = labelIntReader.Read(ref myStruct);
// </12>
}
{
// <13>
// Create Int32 parser
IWriterToRef<string, int> int32parser = DelegateWriter.Reader((string str) => int.Parse(str));
// Create Int32 printer
IWriterToRef<int, string> int32printer = DelegateWriter.Reader((int value) => value.ToString());
// Create Boxer
IWriterToRef<object, MyStruct> myStructUnboxer = (IWriterToRef<object, MyStruct>)TypeCastT.Create<object, MyStruct>();
// Create Unboxer
IWriterToRef<MyStruct, object> myStructBoxer = (IWriterToRef<MyStruct, object>)TypeCastT.Create<MyStruct, object>();
// Create writer
IWriterFromRef<string, MyStruct> labelWriter = DelegateWriter.Writer((string label, ref MyStruct myStruct) => myStruct.Label = label);
//
IWriterToRef<int, object> boxLabelIntWriter =
(IWriterToRef<int, object>)
labelWriter.CastFromAndTo(
newFrom: typeof(int),
newTo: typeof(object),
casterNewFromToOldFrom: int32printer,
casterOldToToNewTo: myStructBoxer,
casterNewToToOldTo: myStructUnboxer,
casterOldFromToNewFrom: int32parser);
// Create struct
MyStruct myStruct = new MyStruct("100");
// Box it
object box = myStruct;
// Writer label as integer
boxLabelIntWriter.Write(25, ref box);
// </13>
}
}
public record struct MyStruct(string Label);
}