void FindAndAddChildrenToOpenList(Queue <ModelToManifestConversionContext> openList, ModelToManifestConversionContext currentContext, IManifestItem parent)
        {
            if (!(currentContext.CurrentValue.CollectionItemValue is null))
            {
                var validatedType  = validatedTypeProvider.GetValidatedType(parent.ValidatedType, true);
                var collectionItem = new ModelToManifestConversionContext
                {
                    CurrentValue        = currentContext.CurrentValue.CollectionItemValue,
                    MemberName          = currentContext.MemberName,
                    ParentManifestValue = parent,
                    ValidatedType       = validatedType,
                    ConversionType      = currentContext.CurrentValue.CollectionItemValue.ValidateRecursivelyAsAncestor.HasValue
                        ? ModelToManifestConversionType.RecursiveManifestValue
                        : ModelToManifestConversionType.CollectionItem,
                };
                openList.Enqueue(collectionItem);
            }

            foreach (var child in currentContext.CurrentValue.Children)
            {
                var accessor       = accessorFactory.GetAccessorFunction(parent.ValidatedType, child.Key);
                var collectionItem = new ModelToManifestConversionContext
                {
                    CurrentValue        = child.Value,
                    AccessorFromParent  = accessor.AccessorFunction,
                    MemberName          = child.Key,
                    ParentManifestValue = parent,
                    ValidatedType       = accessor.ExpectedType,
                    ConversionType      = child.Value.ValidateRecursivelyAsAncestor.HasValue
                        ? ModelToManifestConversionType.RecursiveManifestValue
                        : ModelToManifestConversionType.Manifest,
                };
                openList.Enqueue(collectionItem);
            }

            if (currentContext.CurrentValue is IHasPolymorphicValues hasPolyValues)
            {
                foreach (var polyValue in hasPolyValues.PolymorphicValues)
                {
                    var polymorphicItem = new ModelToManifestConversionContext
                    {
                        CurrentValue        = polyValue.Value,
                        ParentManifestValue = parent,
                        PolymorphicTypeName = polyValue.Key,
                        ConversionType      = ModelToManifestConversionType.PolymorphicType,
                    };
                    openList.Enqueue(polymorphicItem);
                }
            }
        }
Ejemplo n.º 2
0
        /// <inheritdoc/>
        public IManifestItem GetManifestItem(ModelToManifestConversionContext context)
        {
            var result = wrapped.GetManifestItem(context);

            var identityMember = context.CurrentValue.IdentityMemberName;

            if (result is ManifestValueBase valueBase && !String.IsNullOrWhiteSpace(identityMember))
            {
                var accessorFunction = accessorFactory.GetAccessorFunction(context.ValidatedType, identityMember).AccessorFunction;
                valueBase.IdentityAccessor = accessorFunction;
            }

            return(result);
        }