Ejemplo n.º 1
0
            private static IDictionary <string, Expression> Populate(NewExpression expression)
            {
                var dataType       = (StructuralDataType)DataType.FromType(expression.Type, allowCycles: true);
                var memberBindings = dataType.Properties.ToDictionary(p => p.Name, p => (Expression) new UnassignedExpression(p.Type.UnderlyingType));

                var parameters = expression.Constructor.GetParameters();

                for (var i = 0; i < expression.Arguments.Count; ++i)
                {
                    var parameter = parameters[i];
                    var name      = default(string);
                    var mapping   = parameter.GetCustomAttribute <MappingAttribute>(inherit: false);
                    if (mapping != null)
                    {
                        name = mapping.Uri;
                    }
                    else if (expression.Members.Count == expression.Arguments.Count)
                    {
                        mapping = expression.Members[i].GetCustomAttribute <MappingAttribute>(inherit: false);
                        name    = mapping != null ? mapping.Uri : expression.Members[i].Name;
                    }
                    if (name == null)
                    {
                        throw new InvalidOperationException("Cannot determine parameter mapping.");
                    }

                    Assign(memberBindings, name, expression.Arguments[i]);
                }

                var reducer = new UnassignedExpressionReducer();

                return(memberBindings.ToDictionary(kv => kv.Key, kv => reducer.Visit(kv.Value)));
            }
Ejemplo n.º 2
0
            private static IDictionary <string, Expression> Populate(MemberInitExpression expression)
            {
                var dataType       = (StructuralDataType)DataType.FromType(expression.Type, allowCycles: true);
                var memberBindings = dataType.Properties.ToDictionary(p => p.Name, p => (Expression) new UnassignedExpression(p.Type.UnderlyingType));

                foreach (var binding in expression.Bindings)
                {
                    switch (binding.BindingType)
                    {
                    case MemberBindingType.Assignment:
                    {
                        var mapping = binding.Member.GetCustomAttribute <MappingAttribute>(inherit: false);
                        var name    = mapping != null ? mapping.Uri : binding.Member.Name;
                        Assign(memberBindings, name, ((MemberAssignment)binding).Expression);
                        break;
                    }

                    case MemberBindingType.ListBinding:
                    {
                        var mapping = binding.Member.GetCustomAttribute <MappingAttribute>(inherit: false);
                        var name    = mapping != null ? mapping.Uri : binding.Member.Name;
                        Assign(
                            memberBindings,
                            name,
                            Expression.ListInit(
                                Expression.New(GetMemberType(binding.Member)),
                                ((MemberListBinding)binding).Initializers
                                )
                            );
                        break;
                    }

                    case MemberBindingType.MemberBinding:
                    {
                        var mapping = binding.Member.GetCustomAttribute <MappingAttribute>(inherit: false);
                        var name    = mapping != null ? mapping.Uri : binding.Member.Name;
                        Assign(
                            memberBindings,
                            name,
                            Expression.MemberInit(
                                Expression.New(GetMemberType(binding.Member)),
                                ((MemberMemberBinding)binding).Bindings
                                )
                            );
                        break;
                    }

                    default:
                        throw new InvalidOperationException("Cannot extract mapped expression from binding.");
                    }
                }

                var reducer = new UnassignedExpressionReducer();

                return(memberBindings.ToDictionary(kv => kv.Key, kv => reducer.Visit(kv.Value)));
            }
Ejemplo n.º 3
0
        /// <summary>
        /// Transforms an expression by replacing entity types.
        /// </summary>
        /// <param name="expression">The expression to transform.</param>
        /// <returns>An expression with entity types replaced.</returns>
        public override Expression Apply(Expression expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            var res = base.Apply(expression);

            res = new UnassignedExpressionReducer().Visit(res);
            return(res);
        }