<PackageReference Include="Castle.Windsor" Version="6.0.0" />

AttributeAwareConverter

Looks for a ConvertibleAttribute on the type to be converted. If found, the TypeConverter defined by the attribute is used to perform the conversion.
using Castle.Core.Configuration; using Castle.Core.Internal; using System; using System.Reflection; namespace Castle.MicroKernel.SubSystems.Conversion { public class AttributeAwareConverter : AbstractTypeConverter { public override bool CanHandleType(Type type) { return TryGetConverterInstance(type)?.CanHandleType(type) ?? false; } public override object PerformConversion(string value, Type targetType) { return GetConverterInstance(targetType).PerformConversion(value, targetType); } public override object PerformConversion(IConfiguration configuration, Type targetType) { return GetConverterInstance(targetType).PerformConversion(configuration, targetType); } private ITypeConverter GetConverterInstance(Type type) { ITypeConverter typeConverter = TryGetConverterInstance(type); if (typeConverter == null) throw new InvalidOperationException("Type " + type.Name + " does not have a Convertible attribute."); return typeConverter; } private ITypeConverter TryGetConverterInstance(Type type) { ITypeConverter typeConverter = null; ConvertibleAttribute convertibleAttribute = (ConvertibleAttribute)type.GetTypeInfo().GetCustomAttribute(typeof(ConvertibleAttribute)); if (convertibleAttribute != null) { typeConverter = convertibleAttribute.ConverterType.CreateInstance<ITypeConverter>(Array.Empty<object>()); typeConverter.Context = base.Context; } return typeConverter; } } }