ComponentConverter
using Castle.Core.Configuration;
using Castle.MicroKernel.Context;
using Castle.MicroKernel.Util;
using System;
namespace Castle.MicroKernel.SubSystems.Conversion
{
[Serializable]
public class ComponentConverter : AbstractTypeConverter, IKernelDependentConverter
{
public override bool CanHandleType(Type type, IConfiguration configuration)
{
if (configuration.get_Value() != null)
return ReferenceExpressionUtil.IsReference(configuration.get_Value());
return false;
}
public override bool CanHandleType(Type type)
{
if (base.Context.Kernel == null)
return false;
return base.Context.Kernel.HasComponent(type);
}
public override object PerformConversion(string value, Type targetType)
{
string text = ReferenceExpressionUtil.ExtractComponentName(value);
if (text == null)
throw new ConverterException($"""{value}""{targetType.FullName}""");
IHandler handler = base.Context.Kernel.LoadHandlerByName(text, targetType, null);
if (handler == null)
throw new ConverterException($"""{text}""");
return handler.Resolve(base.Context.CurrentCreationContext ?? CreationContext.CreateEmpty());
}
public override object PerformConversion(IConfiguration configuration, Type targetType)
{
return PerformConversion(configuration.get_Value(), targetType);
}
}
}