Пример #1
0
 public bool Equals(MethodValueGetter other)
 {
     if (ReferenceEquals(null, other))
     {
         return(false);
     }
     if (ReferenceEquals(this, other))
     {
         return(true);
     }
     return(Equals(other._methodInfo, _methodInfo) && Enumerable.SequenceEqual(other._arguments, _arguments));
 }
Пример #2
0
 public bool Equals(MethodValueGetter other)
 {
     if (ReferenceEquals(null, other)) return false;
     if (ReferenceEquals(this, other)) return true;
     return Equals(other._methodInfo, _methodInfo) && Enumerable.SequenceEqual(other._arguments, _arguments);
 }
Пример #3
0
 public SingleMethod(MethodValueGetter getter)
 {
     _getter = getter;
 }
Пример #4
0
 public SingleMethod(MethodValueGetter getter, Type ownerType)
 {
     _getter    = getter;
     _ownerType = ownerType;
 }
Пример #5
0
        private static void buildValueGetters(Expression expression, IList <IValueGetter> list)
        {
            var memberExpression = expression 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);
            }
        }