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

GenericListConverter

using Castle.Core.Configuration; using System; using System.Collections.Generic; using System.Diagnostics; namespace Castle.MicroKernel.SubSystems.Conversion { [Serializable] public class GenericListConverter : AbstractTypeConverter { private class ListHelper<T> : IGenericCollectionConverterHelper { private GenericListConverter parent; public ListHelper(GenericListConverter parent) { this.parent = parent; } public object ConvertConfigurationToCollection(IConfiguration configuration) { List<T> list = new List<T>(); foreach (IConfiguration child in configuration.Children) { T item = (T)parent.Context.Composition.PerformConversion(child, typeof(T)); list.Add(item); } return list; } } public override bool CanHandleType(Type type) { if (type.IsGenericType) { Type genericTypeDefinition = type.GetGenericTypeDefinition(); return (object)genericTypeDefinition == typeof(IList<>) || (object)genericTypeDefinition == typeof(ICollection<>) || (object)genericTypeDefinition == typeof(List<>) || (object)genericTypeDefinition == typeof(IEnumerable<>); } return false; } public override object PerformConversion(string value, Type targetType) { throw new NotImplementedException(); } public override object PerformConversion(IConfiguration configuration, Type targetType) { Debug.Assert(CanHandleType(targetType)); Type[] genericArguments = targetType.GetGenericArguments(); if (genericArguments.Length != 1) throw new ConverterException("Expected type with one generic argument."); string text = configuration.Attributes["type"]; Type type = genericArguments[0]; if (text != null) type = (Type)base.Context.Composition.PerformConversion(text, typeof(Type)); IGenericCollectionConverterHelper genericCollectionConverterHelper = (IGenericCollectionConverterHelper)Activator.CreateInstance(typeof(ListHelper<>).MakeGenericType(type), this); return genericCollectionConverterHelper.ConvertConfigurationToCollection(configuration); } } }