Func
Func<From,To> service request is handled and internally processed as ConverterRequest.
// Create dependency injection
IServiceProvider serviceProvider = Services.Create(ConverterHandlers.Instance);
// Query converter
Func<double, BigInteger> converter = serviceProvider.GetRequiredService<Func<double, BigInteger>>();
// Convert
BigInteger b = converter(2.0);
Func<From, IServiceProvider, To> is version where argument can be provided to IWriter.
// Create dependency injection
IServiceProvider serviceProvider = Services.Create(ConverterHandlers.Instance);
// Query converter
Func<string, IServiceProvider, DateTime> parser = serviceProvider.GetRequiredService<Func<string, IServiceProvider, DateTime>>();
// Parse
var dateFormat = new Avalanche.Converter.StringConverter.FormatArgument(CultureInfo.InvariantCulture, "yyyyMMdd_HHmmss");
DateTime dateTime = parser("20200505_101010", dateFormat);
TryWriteToRef<From, To> is another delegate that can be requested. It uses TryWrite.
// Create dependency injection
IServiceProvider serviceProvider = Services.Create(ConverterHandlers.Instance);
// Query converter
TryWriteToRef<string, DateTime> parser = serviceProvider.GetRequiredService<TryWriteToRef<string, DateTime>>();
// Convert
var dateFormat = new Avalanche.Converter.StringConverter.FormatArgument(CultureInfo.InvariantCulture, "yyyyMMdd_HHmmss");
DateTime dateTime = default;
bool ok = parser("20200505_101010", ref dateTime, dateFormat);
Converters can be added creating a IHandler that process ConverterRequests. The following example builds converters that concatenate elements into a string.
// Create dependency injection
IServiceProvider serviceProvider = Services.Create((ConverterHandlers.Instance, new EnumerableJoinConverterFactory()));
// Request printer
Func<HashSet<DateTime>, string> dateTimeSetPrinter = serviceProvider.GetRequiredService<Func<HashSet<DateTime>, string>>();
// Create set
HashSet<DateTime> times = new HashSet<DateTime>
{
new DateTime(1999, 1, 1),
new DateTime(2003, 2, 2),
new DateTime(2005, 5, 5),
};
// Print
string print = dateTimeSetPrinter(times);
Console.WriteLine(print);
// "1.1.1999 0.00.00, 2.2.2003 0.00.00, 5.5.2005 0.00.00"
/// <summary>Creates writers that concatenate elements and outputs as string.</summary>
public class EnumerableJoinConverterFactory : IHandler<ConverterRequest, IWriter>
{
[Order(-1_000_000_000_000L)] // <- Make sure order is BEFORE StringConverterFactory
public void Handle(IQuery<ConverterRequest, IWriter> query)
{
// Already handled
if (query.Handled()) return;
// Cast types
if (query.Request.From is not Type fromType || query.Request.To is not Type toType) return;
// Expect 'to' as string
if (!toType.Equals(typeof(string))) return;
// Expect 'from' as IEnumerable<T>
if (!TypeUtilities.TryGetTypeArgumentOfCorrespondingDefinedType(fromType, typeof(IEnumerable<>), 0, out Type elementType)) return;
// Query element printer
var elementCastRequest = new ConverterRequest(elementType, typeof(string));
if (!query.Service.TryGet(elementCastRequest, out IWriterTo<string> elementPrinter)) return;
// Create writer
IWriter writer = ctor.Create(fromType, elementType, elementPrinter);
// Assign result
query.Response.SetValue(writer);
}
static ConstructorT2<IWriter, IWriter> ctor = new ConstructorT2<IWriter, IWriter>(typeof(EnumerableJoinWriter<,>));
/// <summary>Writer that concatenates element and prints as string. Uses ", " as separator.</summary>
/// <typeparam name="E">Enumerable type</typeparam>
/// <typeparam name="T">Element type</typeparam>
class EnumerableJoinWriter<E, T> : WriterToRefCastObject<E, string>.FromObject where E : IEnumerable<T>
{
IWriterToRef<T, string> elementPrinter;
public EnumerableJoinWriter(IWriter elementPrinter)
{
this.elementPrinter = (IWriterToRef<T, string>)elementPrinter;
}
public override bool TryWrite(E from, ref string to, IServiceProvider context = null)
{
if (from == null) return false;
StringBuilder sb = new StringBuilder();
foreach (T element in from)
{
if (sb.Length > 0) sb.Append(", ");
if (elementPrinter.TryRead(element, out string print, context)) sb.Append(print);
}
to = sb.ToString();
return true;
}
}
}
Requesting same converter as Func<From, IServiceProvider, To> allows to feed date-time formats.
// Request printer where format can be supplied
Func<HashSet<DateTime>, IServiceProvider, string> dateTimeSetPrinter2 = serviceProvider.GetRequiredService<Func<HashSet<DateTime>, IServiceProvider, string>>();
// Create format
var dateFormat = new Avalanche.Converter.StringConverter.FormatArgument(CultureInfo.InvariantCulture, "yyyyMMdd_HHmmss");
// Print
string print2 = dateTimeSetPrinter2(times, dateFormat);
Console.WriteLine(print2);
// 19990101_000000, 20030202_000000, 20050505_000000
Full Example
Full example
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using System.Text;
using Avalanche.Converter;
using Avalanche.Service;
using Avalanche.Utilities;
using Avalanche.Writer;
using Microsoft.Extensions.DependencyInjection;
public class func
{
public static void Run()
{
{
// <01>
// Create dependency injection
IServiceProvider serviceProvider = Services.Create(ConverterHandlers.Instance);
// Query converter
Func<double, BigInteger> converter = serviceProvider.GetRequiredService<Func<double, BigInteger>>();
// Convert
BigInteger b = converter(2.0);
// </01>
}
{
// <02>
// Create dependency injection
IServiceProvider serviceProvider = Services.Create(ConverterHandlers.Instance);
// Query converter
Func<string, IServiceProvider, DateTime> parser = serviceProvider.GetRequiredService<Func<string, IServiceProvider, DateTime>>();
// Parse
var dateFormat = new Avalanche.Converter.StringConverter.FormatArgument(CultureInfo.InvariantCulture, "yyyyMMdd_HHmmss");
DateTime dateTime = parser("20200505_101010", dateFormat);
// </02>
}
{
// <03>
// Create dependency injection
IServiceProvider serviceProvider = Services.Create(ConverterHandlers.Instance);
// Query converter
TryWriteToRef<string, DateTime> parser = serviceProvider.GetRequiredService<TryWriteToRef<string, DateTime>>();
// Convert
var dateFormat = new Avalanche.Converter.StringConverter.FormatArgument(CultureInfo.InvariantCulture, "yyyyMMdd_HHmmss");
DateTime dateTime = default;
bool ok = parser("20200505_101010", ref dateTime, dateFormat);
// </03>
}
{
// <04>
// Create dependency injection
IServiceProvider serviceProvider = Services.Create((ConverterHandlers.Instance, new EnumerableJoinConverterFactory()));
// Request printer
Func<HashSet<DateTime>, string> dateTimeSetPrinter = serviceProvider.GetRequiredService<Func<HashSet<DateTime>, string>>();
// Create set
HashSet<DateTime> times = new HashSet<DateTime>
{
new DateTime(1999, 1, 1),
new DateTime(2003, 2, 2),
new DateTime(2005, 5, 5),
};
// Print
string print = dateTimeSetPrinter(times);
Console.WriteLine(print);
// "1.1.1999 0.00.00, 2.2.2003 0.00.00, 5.5.2005 0.00.00"
// </04>
// <05>
// Request printer where format can be supplied
Func<HashSet<DateTime>, IServiceProvider, string> dateTimeSetPrinter2 = serviceProvider.GetRequiredService<Func<HashSet<DateTime>, IServiceProvider, string>>();
// Create format
var dateFormat = new Avalanche.Converter.StringConverter.FormatArgument(CultureInfo.InvariantCulture, "yyyyMMdd_HHmmss");
// Print
string print2 = dateTimeSetPrinter2(times, dateFormat);
Console.WriteLine(print2);
// 19990101_000000, 20030202_000000, 20050505_000000
// </05>
}
}
}
// <10>
/// <summary>Creates writers that concatenate elements and outputs as string.</summary>
public class EnumerableJoinConverterFactory : IHandler<ConverterRequest, IWriter>
{
[Order(-1_000_000_000_000L)] // <- Make sure order is BEFORE StringConverterFactory
public void Handle(IQuery<ConverterRequest, IWriter> query)
{
// Already handled
if (query.Handled()) return;
// Cast types
if (query.Request.From is not Type fromType || query.Request.To is not Type toType) return;
// Expect 'to' as string
if (!toType.Equals(typeof(string))) return;
// Expect 'from' as IEnumerable<T>
if (!TypeUtilities.TryGetTypeArgumentOfCorrespondingDefinedType(fromType, typeof(IEnumerable<>), 0, out Type elementType)) return;
// Query element printer
var elementCastRequest = new ConverterRequest(elementType, typeof(string));
if (!query.Service.TryGet(elementCastRequest, out IWriterTo<string> elementPrinter)) return;
// Create writer
IWriter writer = ctor.Create(fromType, elementType, elementPrinter);
// Assign result
query.Response.SetValue(writer);
}
static ConstructorT2<IWriter, IWriter> ctor = new ConstructorT2<IWriter, IWriter>(typeof(EnumerableJoinWriter<,>));
/// <summary>Writer that concatenates element and prints as string. Uses ", " as separator.</summary>
/// <typeparam name="E">Enumerable type</typeparam>
/// <typeparam name="T">Element type</typeparam>
class EnumerableJoinWriter<E, T> : WriterToRefCastObject<E, string>.FromObject where E : IEnumerable<T>
{
IWriterToRef<T, string> elementPrinter;
public EnumerableJoinWriter(IWriter elementPrinter)
{
this.elementPrinter = (IWriterToRef<T, string>)elementPrinter;
}
public override bool TryWrite(E from, ref string to, IServiceProvider context = null)
{
if (from == null) return false;
StringBuilder sb = new StringBuilder();
foreach (T element in from)
{
if (sb.Length > 0) sb.Append(", ");
if (elementPrinter.TryRead(element, out string print, context)) sb.Append(print);
}
to = sb.ToString();
return true;
}
}
}
// </10>