private IExpression Index(IAstNode operand, AstNodeCollection arguments) { var resolvedArguments = ResolveArguments(arguments); var resolvedOperand = operand.Accept(this); if (resolvedOperand.Type.IsArray) { if (resolvedArguments.Length != resolvedOperand.Type.GetArrayRank()) { throw new ExpressionsException( "Invalid array index rank", ExpressionsExceptionType.TypeMismatch ); } foreach (var argument in resolvedArguments) { if (!TypeUtil.IsCastAllowed(argument.Type, typeof(int))) { throw new ExpressionsException( "Argument of array index must be convertable to integer", ExpressionsExceptionType.TypeMismatch ); } } if (resolvedArguments.Length == 1) { return(new Expressions.Index(resolvedOperand, resolvedArguments[0], resolvedOperand.Type.GetElementType())); } else { return(_resolver.ResolveMethod(resolvedOperand, "Get", resolvedArguments)); } } var defaultMemberAttributes = resolvedOperand.Type.GetCustomAttributes(typeof(DefaultMemberAttribute), true); if (defaultMemberAttributes.Length != 1) { throw new ExpressionsException( "Operand does not support indexing", ExpressionsExceptionType.TypeMismatch ); } var result = _resolver.ResolveMethod(resolvedOperand, "get_" + ((DefaultMemberAttribute)defaultMemberAttributes[0]).MemberName, resolvedArguments); if (result == null) { throw new ExpressionsException( "Unresolved index method", ExpressionsExceptionType.UnresolvedMethod ); } return(result); }