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