private object ConvertToGenericList(Type desiredType, String key, Node node, out bool conversionSucceeded)
{
Type[] genericArgs = desiredType.GetGenericArguments();
if (genericArgs.Length == 0)
{
throw new BindingException("Can't infer the Generics placeholders (type parameters). Key {0}.", key);
}
Type elemType = genericArgs[0];
if (node == null)
{
conversionSucceeded = false;
return CreateInstance(desiredType, key, node);
}
else if (node.NodeType == NodeType.Leaf)
{
LeafNode leafNode = node as LeafNode;
return Converter.Convert(desiredType, leafNode.ValueType, leafNode.Value, out conversionSucceeded);
}
else if (node.NodeType == NodeType.Indexed)
{
IndexedNode indexedNode = node as IndexedNode;
IList convertedNodes;
if (IsSimpleProperty(elemType))
{
convertedNodes = ConvertFlatNodesToList(elemType, indexedNode.ChildNodes, out conversionSucceeded);
}
else
{
convertedNodes = ConvertComplexNodesToList(elemType, indexedNode, out conversionSucceeded);
}
Type desiredImplType = desiredType.IsInterface
? typeof(List<>).MakeGenericType(elemType)
: desiredType;
IList target = (IList)CreateInstance(desiredImplType, key, node);
foreach(object elem in convertedNodes)
{
target.Add(elem);
}
return target;
}
else
{
throw new BindingException("Could not convert param to generic list as the node related " +
"to the param is not a leaf node nor an indexed node. Key {0}", key);
}
}