OneOfAttribute
[OneOf(types)] attribute is a way to define one-of cases in a class.
[OneOf(typeof(Result), typeof(Error), typeof(NoResult))]
public interface IMessage
{
public sealed class Result : IMessage { }
public sealed class Error : IMessage { }
public sealed class NoResult : IMessage { }
}
AccessorRequest(target) requests for IAccessor depending on type target.
// Create service
IService service = Services.Create(NetAccessorHandlers.Instance);
// Create container target
IContainerTarget target = new NetOneOf(typeof(IMessage));
// Create request
IRequestFor<IAccessor> request = new AccessorRequest(target);
// Issue request
IOneOfAccessor<IMessage> accessor = service.GetRequired<IRequest, IOneOfAccessor<IMessage>>(request);
OneOfAccessorRequest(target) requests for IOneOfAccessor<OneOf, Element>.
// Create service
IService service = Services.Create(NetAccessorHandlers.Instance);
// Create container target
IContainerTarget target = new NetOneOf(typeof(IMessage));
// Create request
IRequestFor<IOneOfAccessor> request = new OneOfAccessorRequest(target);
// Issue request
IOneOfAccessor<IMessage> accessor = service.GetRequired<IRequest, IOneOfAccessor<IMessage>>(request);
OneOfAccessorRequest is specifically a request for specific writers. Each can be assigned with explicit customization.
// Create service
IService service = Services.Create(NetAccessorHandlers.Instance);
// Create container target
IContainerTarget target = new NetOneOf(typeof(IMessage));
// Create request
IRequestFor<IOneOfAccessor> request = new OneOfAccessorRequest
{
Constructor = new ConstructorRequest(target),
Deconstructor = new DeconstructorRequest(target),
DefaultConstructor = new DefaultConstructorRequest(target),
Fields = new ContentAccessorsRequest(target),
IsAssigned = new IsAssignedRequest(target),
Unassign = new UnassignRequest(target),
ContainerType = new ContainerTypeRequest(target),
ContentType = new ContentTypeRequest(target),
};
// Issue request
IOneOfAccessor<IMessage> accessor = service.GetRequired<IRequest, IOneOfAccessor<IMessage>>(request);
Usage
.DefaultConstructor creates a oneof with default value.
IMessage oneOf = accessor.DefaultConstructor.Read();
.Constructor creates a oneof from enumerable of elements.
IMessage oneOf = accessor.Constructor.ReadAs<(int tag, IMessage message), IMessage>((2, new IMessage.NoResult()));
.Deconstructor reads values as an enumerable.
IMessage oneOf = new IMessage.Error();
(int tag, IMessage msg) = accessor.Deconstructor.ReadAs<IMessage, (int tag, IMessage message)>(oneOf);
.Fields contains one-of option types.
IMessage oneOf = null!;
accessor.Fields[1].Writer.WriteAs<IMessage.Error, IMessage>(new IMessage.Error(), ref oneOf);
IMessage.Error result = accessor.Fields[1].Reader.ReadAs<IMessage, IMessage.Error>(oneOf);
.IsAssigned tests whether a oneof is assigned in container.
IMessage oneOf = new IMessage.Result();
bool nonNull = accessor.IsAssigned.Read(oneOf);
.Unassign removes oneof at container.
IMessage oneOf = new IMessage.Result();
accessor.Unassign.Write(default, ref oneOf);
Full Example
Full example
using Avalanche.Accessor;
using Avalanche.DataType;
using Avalanche.Service;
using Avalanche.Utilities;
using Avalanche.Writer;
using Microsoft.Extensions.DependencyInjection;
using static System.Console;
public class oneofattribute
{
public static void Run()
{
{
// <10>
// Create service
IService service = Services.Create(NetAccessorHandlers.Instance);
// Create container target
IContainerTarget target = new NetOneOf(typeof(IMessage));
// Create request
IRequestFor<IAccessor> request = new AccessorRequest(target);
// Issue request
IOneOfAccessor<IMessage> accessor = service.GetRequired<IRequest, IOneOfAccessor<IMessage>>(request);
// </10>
}
{
// <11>
// Create service
IService service = Services.Create(NetAccessorHandlers.Instance);
// Create container target
IContainerTarget target = new NetOneOf(typeof(IMessage));
// Create request
IRequestFor<IOneOfAccessor> request = new OneOfAccessorRequest(target);
// Issue request
IOneOfAccessor<IMessage> accessor = service.GetRequired<IRequest, IOneOfAccessor<IMessage>>(request);
// </11>
}
{
// <11B>
// Create service
IService service = Services.Create(NetAccessorHandlers.Instance);
// Create container target
IContainerTarget target = new NetOneOf(typeof(IMessage), typeof(object));
// Create request
IRequestFor<IOneOfAccessor> request = new OneOfAccessorRequest(target);
// Issue request
IOneOfAccessor<IMessage> accessor = service.GetRequired<IRequest, IOneOfAccessor<IMessage, object>>(request);
// </11B>
}
{
// <12>
// Create service
IService service = Services.Create(NetAccessorHandlers.Instance);
// Create container target
IContainerTarget target = new NetOneOf(typeof(IMessage));
// Create request
IRequestFor<IOneOfAccessor> request = new OneOfAccessorRequest
{
Constructor = new ConstructorRequest(target),
Deconstructor = new DeconstructorRequest(target),
DefaultConstructor = new DefaultConstructorRequest(target),
Fields = new ContentAccessorsRequest(target),
IsAssigned = new IsAssignedRequest(target),
Unassign = new UnassignRequest(target),
ContainerType = new ContainerTypeRequest(target),
ContentType = new ContentTypeRequest(target),
};
// Issue request
IOneOfAccessor<IMessage> accessor = service.GetRequired<IRequest, IOneOfAccessor<IMessage>>(request);
// </12>
}
{
IOneOfAccessor<IMessage> accessor = Services.Create(NetAccessorHandlers.Instance)
.GetRequiredService<IOneOfAccessor<IMessage>>();
{
// <51>
IMessage oneOf = accessor.DefaultConstructor.Read();
// </51>
}
{
// <52>
IMessage oneOf = accessor.Constructor.ReadAs<(int tag, IMessage message), IMessage>((2, new IMessage.NoResult()));
// </52>
}
{
// <53>
IMessage oneOf = new IMessage.Error();
(int tag, IMessage msg) = accessor.Deconstructor.ReadAs<IMessage, (int tag, IMessage message)>(oneOf);
// </53>
}
{
// <54>
IMessage oneOf = null!;
accessor.Fields[1].Writer.WriteAs<IMessage.Error, IMessage>(new IMessage.Error(), ref oneOf);
IMessage.Error result = accessor.Fields[1].Reader.ReadAs<IMessage, IMessage.Error>(oneOf);
// </54>
}
{
// <62>
IMessage oneOf = new IMessage.Result();
bool nonNull = accessor.IsAssigned.Read(oneOf);
// </62>
}
{
// <63>
IMessage oneOf = new IMessage.Result();
accessor.Unassign.Write(default, ref oneOf);
// </63>
}
}
}
// <100>
[OneOf(typeof(Result), typeof(Error), typeof(NoResult))]
public interface IMessage
{
public sealed class Result : IMessage { }
public sealed class Error : IMessage { }
public sealed class NoResult : IMessage { }
}
// </100>
}