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;
}
}
}