Exemple #1
0
        private IJsonMetadata GetMetadata(IMetadataBuilderContext context, MetadataIdentity identity)
        {
            MetadataIdentity  parentIdentity = identity.Parent();
            IJsonMetadata     parent         = context.GetMetadata <IJsonMetadata>(parentIdentity.Name) ?? this.GetMetadata(context, parentIdentity);
            IRelationMetadata relation       = identity.GetMetadata <IRelationMetadata>();

            if (parent == null || relation == null)
            {
                return(null);
            }

            JsonMetadata metadata = new JsonMetadata(relation);

            if (this.HasJsonAttribute(relation) || relation.HasFlag(RelationMetadataFlags.Item))
            {
                metadata.MemberOf = metadata;
                metadata.IsRoot   = true;
                metadata.Path     = "$";
            }
            else
            {
                metadata.MemberOf = parent.MemberOf;
                metadata.IsRoot   = false;
                metadata.Path     = $"{parent.Path}.{this.GetPropertyNameFromContract(metadata)}";
            }

            context.AddMetadata <IJsonMetadata>(metadata);

            return(metadata);
        }
Exemple #2
0
        private IBindingMetadata FindDynamicMetadata(MetadataIdentity identity)
        {
            IBindingMetadata metadata = identity.GetMetadata <IBindingMetadata>();

            while (metadata == null && (identity = identity.Pop()) != null)
            {
                metadata = identity.GetMetadata <IBindingMetadata>();
            }

            if (metadata != null && metadata.HasFlag(BindingMetadataFlags.Dynamic))
            {
                return(metadata);
            }

            return(null);
        }
Exemple #3
0
        public ItemBuilder(RelationIdentity relation, MetadataIdentity source)
        {
            this.relation        = relation ?? throw new ArgumentNullException(nameof(relation));
            this.sourceMetadata  = source.GetMetadata <IRelationMetadata>();
            this.headingMetadata = relation.Heading.Select(m => m.GetMetadata <IRelationMetadata>()).ToArray();

            this.Validate();
        }
Exemple #4
0
        private void AddValueNode(List <MetadataNode> itemNodes, ColumnIdentity value)
        {
            MetadataIdentity identity = new MetadataIdentity(this.schema, value.Name);
            IBindingMetadata metadata = identity.GetMetadata <IBindingMetadata>() ?? this.FindDynamicMetadata(identity);

            if (metadata != null && !this.IsOutsideResultScope(metadata))
            {
                if (metadata.HasFlag(BindingMetadataFlags.Dynamic))
                {
                    this.AddDynamicNode(itemNodes, identity, metadata, value);
                }
                else
                {
                    this.AddStaticNode(itemNodes, metadata, value);
                }
            }
        }
Exemple #5
0
        private static Action <IField, object> BuildFieldBinder(MetadataIdentity metadata, ColumnIdentity column)
        {
            ParameterExpression fieldParam = Expression.Parameter(typeof(IField));
            ParameterExpression valueParam = Expression.Parameter(typeof(object));

            IBindingMetadata binding = metadata.GetMetadata <IBindingMetadata>();

            Expression bindValue = valueParam;

            if (metadata != null)
            {
                Type sourceType = null;

                if (column != null)
                {
                    BindingColumnInfo columnInfo = new BindingColumnInfo()
                    {
                        Column    = column,
                        CanBeNull = true,
                        Metadata  = binding,
                    };

                    sourceType = binding.Value?.Read(columnInfo)?.ReturnType;
                }

                BindingValueInfo valueInfo = new BindingValueInfo()
                {
                    CanBeNull   = true,
                    CanBeDbNull = true,
                    Metadata    = binding,
                    Value       = bindValue,
                    SourceType  = sourceType,
                    TargetType  = binding.Type,
                };

                bindValue = binding.Value?.Convert?.Invoke(valueInfo) ?? valueParam;
            }

            MethodInfo bindMethod = typeof(IField).GetMethod(nameof(IField.Bind), new[] { typeof(object) });

            Expression bindCall = Expression.Call(fieldParam, bindMethod, Expression.Convert(bindValue, typeof(object)));

            return(Expression.Lambda <Action <IField, object> >(bindCall, fieldParam, valueParam).Compile());
        }