protected T OnGetValue(int index)
        {
            IndexerValueGetter handler = GetValue;

            if (handler != null)
            {
                return(handler(this, index));
            }
            throw new ListException("No ValueGetter set.");
        }
 public ArrayIndexer1(IndexerValueGetter getter)
 {
     _getter = getter;
 }
        private static void BuildValueGetters(Expression expression, IList <IValueGetter> list)
        {
            var memberExpression = expression as MemberExpression;

            if (memberExpression == null && expression is UnaryExpression)
            {
                memberExpression = ((UnaryExpression)expression).Operand as MemberExpression;
            }

            if (memberExpression != null)
            {
                var propertyInfo = (PropertyInfo)memberExpression.Member;
                list.Add(new PropertyValueGetter(propertyInfo));
                if (memberExpression.Expression != null)
                {
                    BuildValueGetters(memberExpression.Expression, list);
                }
            }

            //deals with collection indexers, an indexer [0] will look like a get(0) method call expression
            var methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression != null)
            {
                var        methodInfo = methodCallExpression.Method;
                Expression argument   = methodCallExpression.Arguments.FirstOrDefault();

                if (argument == null)
                {
                    var methodValueGetter = new MethodValueGetter(methodInfo, new object[0]);
                    list.Add(methodValueGetter);
                }
                else
                {
                    object value;
                    if (TryEvaluateExpression(argument, out value))
                    {
                        var methodValueGetter = new MethodValueGetter(methodInfo, new object[] { value });
                        list.Add(methodValueGetter);
                    }
                }



                if (methodCallExpression.Object != null)
                {
                    BuildValueGetters(methodCallExpression.Object, list);
                }
            }

            if (expression.NodeType == ExpressionType.ArrayIndex)
            {
                var binaryExpression = (BinaryExpression)expression;

                var indexExpression = binaryExpression.Right;

                object index;
                if (TryEvaluateExpression(indexExpression, out index))
                {
                    var indexValueGetter = new IndexerValueGetter(binaryExpression.Left.Type, (int)index);

                    list.Add(indexValueGetter);
                }

                BuildValueGetters(binaryExpression.Left, list);
            }
        }