public override BoundNode VisitDynamicMemberAccess(BoundDynamicMemberAccess node) { // InvokeMember operation: if (node.Invoked) { return node; } // GetMember operation: Debug.Assert(node.TypeArgumentsOpt.IsDefault); var loweredReceiver = VisitExpression(node.Receiver); return _dynamicFactory.MakeDynamicGetMember(loweredReceiver, node.Name, node.Indexed).ToExpression(); }
public override BoundNode VisitDynamicMemberAccess(BoundDynamicMemberAccess node) { if (_inExpressionLambda) { Error(ErrorCode.ERR_ExpressionTreeContainsDynamicOperation, node); } return base.VisitDynamicMemberAccess(node); }
private BoundDynamicMemberAccess TransformDynamicMemberAccess(BoundDynamicMemberAccess memberAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps) { if (!CanChangeValueBetweenReads(memberAccess.Receiver)) { return memberAccess; } // store receiver to temp: var rewrittenReceiver = VisitExpression(memberAccess.Receiver); BoundAssignmentOperator assignmentToTemp; var receiverTemp = _factory.StoreToTemp(rewrittenReceiver, out assignmentToTemp); stores.Add(assignmentToTemp); temps.Add(receiverTemp.LocalSymbol); return new BoundDynamicMemberAccess(memberAccess.Syntax, receiverTemp, memberAccess.TypeArgumentsOpt, memberAccess.Name, memberAccess.Invoked, memberAccess.Indexed, memberAccess.Type); }