Castle.Components.Binder.DataBinder.ConvertToGenericList C# (CSharp) Method

ConvertToGenericList() private method

private ConvertToGenericList ( Type desiredType, String key, Castle.Components.Binder.Node node, bool &conversionSucceeded ) : object
desiredType System.Type
key String
node Castle.Components.Binder.Node
conversionSucceeded bool
return object
		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);
			}
		}