in src/DotNetWorker.Core/Context/Features/DefaultInputConversionFeature.cs [39:90]
public async ValueTask<ConversionResult> ConvertAsync(ConverterContext converterContext)
{
// Check a converter is explicitly specified via the converter context. If so, use that.
IInputConverter? converterFromContext = GetConverterFromContext(converterContext);
if (converterFromContext is not null)
{
var conversionResult = await ConvertAsyncUsingConverter(converterFromContext, converterContext);
if (conversionResult.Status != ConversionStatus.Unhandled)
{
return conversionResult;
}
}
// Get all converters advertised by the Binding Attribute along with supported types by each converter
Dictionary<IInputConverter, List<Type>>? advertisedConverterTypes = GetExplicitConverterTypes(converterContext);
if (advertisedConverterTypes is not null)
{
foreach (var converterType in advertisedConverterTypes)
{
if (IsTargetTypeSupportedByConverter(converterType.Value, converterContext.TargetType))
{
var conversionResult = await ConvertAsyncUsingConverter(converterType.Key, converterContext);
if (conversionResult.Status != ConversionStatus.Unhandled)
{
return conversionResult;
}
}
}
}
if (IsConverterFallbackAllowed(converterContext))
{
// Use the registered converters. The first converter which can handle the conversion wins.
foreach (var converter in _inputConverterProvider.RegisteredInputConverters)
{
var conversionResult = await ConvertAsyncUsingConverter(converter, converterContext);
if (conversionResult.Status != ConversionStatus.Unhandled)
{
return conversionResult;
}
// If "Status" is Unhandled, we move on to the next converter and try to convert with that.
}
}
return ConversionResult.Unhandled();
}