StructLayoutAttribute
[StructLayout(LayoutKind.Explicit)] is another way to formulate an one-of type. Each field must have [FieldOffset(X)] attribute.
The first field at [FieldOffset(0)] indicates tag type. Its length and name can be anything. All other fields must have non zero offset. Note that referable types must be positioned at 8 byte alignments. (Avalanche.DataType.Net.dll)
// Create service
IService service = Services.Create(NetTypeHandlers.Instance);
// Create request
DataTypeRequest<NetOneOf> request = new(typeof(MyOneOf));
// Query
IOneOfType datatype = service.GetRequired<DataTypeRequest<NetOneOf>, IOneOfType>(request);
[StructLayout(LayoutKind.Explicit)]
public struct MyOneOf
{
[FieldOffset(0)] public byte Tag;
[FieldOffset(1)] public uint Int;
[FieldOffset(1)] public ushort Short;
[FieldOffset(1)] public bool Bool;
}
oneoftype+MyOneOf, docs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null : IOneOfType ├── Fields[0] = Int : IFieldType │ └── Value = uint32 : IIntegerType ├── Fields[1] = Short : IFieldType │ └── Value = uint16 : IIntegerType └── Fields[2] = Bool : IFieldType └── Value = bool : IIntegerType
enum is also suitable tag type.
[StructLayout(LayoutKind.Explicit)]
public struct MyOneOf
{
[FieldOffset(0)] public OneOfKind Kind;
[FieldOffset(1)] public uint Int;
[FieldOffset(1)] public ushort Short;
[FieldOffset(1)] public bool Bool;
public enum OneOfKind : byte { Int, Short, Bool }
}
oneoftype+MyOneOf, docs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null : IOneOfType ├── Fields[0] = Int : IFieldType │ └── Value = uint32 : IIntegerType ├── Fields[1] = Short : IFieldType │ └── Value = uint16 : IIntegerType └── Fields[2] = Bool : IFieldType └── Value = bool : IIntegerType
Full Example
Full example
using System.Runtime.InteropServices;
using Avalanche.DataType;
using Avalanche.Identity;
using Avalanche.Service;
using static System.Console;
public class structlayoutattribute
{
public static void Run()
{
{
// <05>
// Create service
IService service = Services.Create(NetTypeHandlers.Instance);
// Create request
DataTypeRequest<NetOneOf> request = new(typeof(MyOneOf));
// Query
IOneOfType datatype = service.GetRequired<DataTypeRequest<NetOneOf>, IOneOfType>(request);
// </05>
// Print
WriteLine(datatype.PrintTree());
}
}
// <101>
[StructLayout(LayoutKind.Explicit)]
public struct MyOneOf
{
[FieldOffset(0)] public byte Tag;
[FieldOffset(1)] public uint Int;
[FieldOffset(1)] public ushort Short;
[FieldOffset(1)] public bool Bool;
}
// </101>
static class _102
{
// <102>
[StructLayout(LayoutKind.Explicit)]
public struct MyOneOf
{
[FieldOffset(0)] public OneOfKind Kind;
[FieldOffset(1)] public uint Int;
[FieldOffset(1)] public ushort Short;
[FieldOffset(1)] public bool Bool;
public enum OneOfKind : byte { Int, Short, Bool }
}
// </102>
}
static class _103
{
// <103>
[StructLayout(LayoutKind.Explicit)]
public sealed class MyOneOf
{
[FieldOffset(0)] public byte Tag;
[FieldOffset(1)] public uint Int;
[FieldOffset(1)] public ushort Short;
[FieldOffset(1)] public bool Bool;
}
// </103>
}
static class _104
{
// <104>
[StructLayout(LayoutKind.Explicit)]
public sealed class MyOneOf
{
[FieldOffset(0)] public OneOfKind Kind;
[FieldOffset(1)] public uint Int;
[FieldOffset(1)] public ushort Short;
[FieldOffset(1)] public bool Bool;
public enum OneOfKind : byte { Int, Short, Bool }
}
// </104>
}
}