Casting
Handler can be casted into other interfaces.
// Create generics handler
IHandler consoleLogger = new ConsoleLogger();
// Cast to IHandler<object, object>
consoleLogger.TryCast(out IHandler<object, object>? castedHandler);
IServiceBase.AsHandler() extension method casts into IHandlerBase.
// Create service
IService service = Services.Create(new ConverterHandlers());
// Cast to handler
IHandler handler = service.AsHandler();
IEntryProviderBase.AsHandler() extension method casts into IHandlerBase.
// Create entry provider
IEntryProvider entryProvider = (IEntryProvider)Services.Create(new ConverterHandlers());
// Cast to handler
IHandlerBase handler = Handlers.EntryProvider(entryProvider);
If handler implements IHandlerCastable, it can explicity participate in casting instantiation.
public class Handler21 : IHandler, IHandlerCastable
{
public void Handle<Request, Response>(IQuery<Request, Response> query) where Request : notnull
=> Console.WriteLine(query.Response);
public bool TryCast([NotNullWhen(true)] out IHandler casted) { casted = null!; return false; }
public bool TryCast<Request, Response>([NotNullWhen(true)] out IHandler<Request, Response> casted) where Request : notnull { casted = null!; return false; }
public bool TryCastAsync([NotNullWhen(true)] out IHandlerAsync casted) { casted = null!; return false; }
public bool TryCastAsync<Request, Response>([NotNullWhen(true)] out IHandlerAsync<Request, Response> casted) where Request : notnull { casted = null!; return false; }
}
Full Example
Full example
using System;
using System.Diagnostics.CodeAnalysis;
using Avalanche.Converter;
using Avalanche.Service;
public class handler_casting
{
public static void Run()
{
{
// <1>
// Create generics handler
IHandler consoleLogger = new ConsoleLogger();
// Cast to IHandler<object, object>
consoleLogger.TryCast(out IHandler<object, object>? castedHandler);
// </1>
}
{
// <2>
// Create service
IService service = Services.Create(new ConverterHandlers());
// Cast to handler
IHandlerBase handler = Handlers.Service(service);
// </2>
}
{
// <3>
// Create service
IService service = Services.Create(new ConverterHandlers());
// Cast to handler
IHandler handler = service.AsHandler();
// </3>
}
{
// <4>
// Create entry provider
IEntryProvider entryProvider = (IEntryProvider)Services.Create(new ConverterHandlers());
// Cast to handler
IHandlerBase handler = Handlers.EntryProvider(entryProvider);
// </4>
}
{
// <5>
// Create entry provider
IEntryProvider entryProvider = (IEntryProvider)Services.Create(new ConverterHandlers());
// Cast to handler
IHandler handler = entryProvider.AsHandler();
// </5>
}
}
// <6>
public class ConsoleLogger : IHandler
{
public void Handle<Request, Response>(IQuery<Request, Response> query) where Request : notnull
=> Console.WriteLine(query.Response);
}
// </6>
// <7>
public class Handler21 : IHandler, IHandlerCastable
{
public void Handle<Request, Response>(IQuery<Request, Response> query) where Request : notnull
=> Console.WriteLine(query.Response);
public bool TryCast([NotNullWhen(true)] out IHandler casted) { casted = null!; return false; }
public bool TryCast<Request, Response>([NotNullWhen(true)] out IHandler<Request, Response> casted) where Request : notnull { casted = null!; return false; }
public bool TryCastAsync([NotNullWhen(true)] out IHandlerAsync casted) { casted = null!; return false; }
public bool TryCastAsync<Request, Response>([NotNullWhen(true)] out IHandlerAsync<Request, Response> casted) where Request : notnull { casted = null!; return false; }
}
// </7>
}