Esempio n. 1
0
            internal override Expression Emit(List <TranslatorResult> propertyReaders)
            {
                // Create expression of the form:
                // _initExpression(children)

                // create member bindings (where values are taken from children)
                var memberBindings         = new MemberBinding[_initExpression.Bindings.Count];
                var constantMemberBindings = new MemberBinding[memberBindings.Length];

                for (var i = 0; i < memberBindings.Length; i++)
                {
                    var           originalBinding = _initExpression.Bindings[i];
                    var           value           = propertyReaders[i].UnwrappedExpression;
                    MemberBinding newBinding      = Expression.Bind(originalBinding.Member, value);
                    MemberBinding constantBinding = Expression.Bind(
                        originalBinding.Member, Expression.Constant(
                            TypeSystem.GetDefaultValue(value.Type), value.Type));
                    memberBindings[i]         = newBinding;
                    constantMemberBindings[i] = constantBinding;
                }

                Expression newProjection = Expression.MemberInit(_initExpression.NewExpression, memberBindings);

                // Indicate that this expression is provided by the user and should not be trusted.
                return(Expression.Call(UserExpressionMarker.MakeGenericMethod(newProjection.Type), newProjection));
            }
Esempio n. 2
0
            internal override Expression Emit(Translator translator, List <TranslatorResult> propertyTranslatorResults)
            {
                // Create expression of the form:
                // _newExpression(children)

                // (ClrType)null
                Expression nullProjection = Expression.Constant(null, this.ClrType);

                // _newExpression with members rebound
                Expression newProjection = Expression.New(_newExpression.Constructor, GetPropertyReaders(propertyTranslatorResults));

                // Indicate that this expression is provided by the user and should not be trusted.
                return(Expression.Call(UserExpressionMarker.MakeGenericMethod(newProjection.Type), newProjection));
            }