/// <summary>Get an <see cref="ObservableCollection{T}"/> containing <paramref name="nodes"/>' values.</summary>
        public override object FromNodes(IEntityProxy parent, IPropertyMapping property, IEntityContext context, IEnumerable <INode> nodes)
        {
            var convertedValues    = nodes.Select(node => ((ICollectionMapping)property).ElementConverter.Convert(node, context));
            var collectionElements = ((IEnumerable <object>)Aggregator.Aggregate(convertedValues)).ToArray();
            var genericArguments   = (property.ReturnType.IsArray ? new[] { property.ReturnType.GetElementType() } : property.ReturnType.GetTypeInfo().GetGenericArguments());
            var observable         = (IList)typeof(ObservableCollection <>).MakeGenericType(genericArguments).GetTypeInfo().GetConstructor(Type.EmptyTypes).Invoke(new object[0]);
            var asEntity           = (typeof(IEntity).GetTypeInfo().IsAssignableFrom(genericArguments.Single()) ? AsEntity.MakeGenericMethod(genericArguments) : null);

            foreach (var item in collectionElements)
            {
                observable.Add(asEntity != null ? asEntity.Invoke(null, new[] { item }) : item);
            }

            ((INotifyCollectionChanged)observable).CollectionChanged += (sender, args) => DynamicExtensions.InvokeSet((dynamic)parent, property.Name, sender);
            return(observable);
        }