protected override object BindSpecialObjectInstance(Type instanceType, string prefix, Node node,
out bool succeeded)
{
succeeded = false;
ActiveRecordModel model = CurrentARModel;
if (model == null)
{
return null;
}
object container = CreateContainer(instanceType);
bool found = false;
Type targetType = null;
ActiveRecordModel targetModel = null;
found = FindPropertyInHasAndBelongsToMany(model, prefix, ref targetType, ref targetModel);
if (!found)
{
found = FindPropertyInHasMany(model, prefix, ref targetType, ref targetModel);
}
if (found)
{
succeeded = true;
ClearContainer(container);
if (node.NodeType == NodeType.Indexed)
{
IndexedNode indexNode = (IndexedNode) node;
Array collArray = Array.CreateInstance(targetType, indexNode.ChildrenCount);
collArray = (Array) InternalBindObject(collArray.GetType(), prefix, node);
foreach(object item in collArray)
{
AddToContainer(container, item);
}
}
else if (node.NodeType == NodeType.Leaf)
{
PrimaryKeyModel pkModel = targetModel.PrimaryKey;
Type pkType = pkModel.Property.PropertyType;
LeafNode leafNode = (LeafNode) node;
bool convSucceeded;
if (leafNode.IsArray) // Multiples values found
{
foreach(object element in (Array) leafNode.Value)
{
object keyConverted = Converter.Convert(pkType, leafNode.ValueType.GetElementType(),
element, out convSucceeded);
if (convSucceeded)
{
object item = FindByPrimaryKey(targetType, keyConverted);
AddToContainer(container, item);
}
}
}
else // Single value found
{
object keyConverted = Converter.Convert(pkType, leafNode.ValueType.GetElementType(),
leafNode.Value, out convSucceeded);
if (convSucceeded)
{
object item = FindByPrimaryKey(targetType, keyConverted);
AddToContainer(container, item);
}
}
}
}
return container;
}