Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
 protected bool Equals(IndexerValueGetter other)
 {
     return _arrayType == other._arrayType && Index == other.Index;
 }
Ejemplo n.º 3
0
 public ArrayIndexer(IndexerValueGetter getter)
 {
     _getter = getter;
 }
Ejemplo n.º 4
0
 protected bool Equals(IndexerValueGetter other)
 {
     return(_arrayType == other._arrayType && Index == other.Index);
 }