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)); }
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)); }