public static bool TryFindArgumentFilterWithin(Expression expression, out IArgumentFilter argumentFilter)
        {
            Debug.Assert(expression != null);

            var visitor = new ArgumentFilterVisitor();
            visitor.Visit(expression);
            argumentFilter = visitor.argumentFilter;
            return argumentFilter != null;
        }
Example #2
0
        public static bool TryFindArgumentFilterWithin(Expression expression, out IArgumentFilter argumentFilter)
        {
            Debug.Assert(expression != null);

            var visitor = new ArgumentFilterVisitor();

            visitor.Visit(expression);
            argumentFilter = visitor.argumentFilter;
            return(argumentFilter != null);
        }
Example #3
0
        public override Expression Visit(Expression node)
        {
            if (node.NodeType == ExpressionType.Convert || node.NodeType == ExpressionType.Call)
            {
                return(base.Visit(node));
            }

            object value;

            if (ValueExtractor.TryFindValueWithin(node, out value))
            {
                this.argumentFilter = new IsArgumentFilter(value);
                return(node);
            }

            return(node);
        }
Example #4
0
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            var filterMethod = node
                               .Method
                               .DeclaringType
                               .GetTypeInfo()
                               .DeclaredMethods
                               .Where(
                declaredMethod =>
                declaredMethod.IsStatic &&
                declaredMethod.Name == node.Method.Name + "Filter" &&
                declaredMethod.GetParameters().Length == node.Arguments.Count)
                               .FirstOrDefault();

            if (filterMethod != null && filterMethod.ReturnType == typeof(IArgumentFilter))
            {
                if (node.Method.IsGenericMethod)
                {
                    filterMethod = filterMethod.MakeGenericMethod(node.Method.GetGenericArguments());
                }

                var argumentsToFilterMethod = new object[node.Arguments.Count];

                for (var i = 0; i < argumentsToFilterMethod.Length; ++i)
                {
                    argumentsToFilterMethod[i] = ValueExtractor.FindValueWithin(node.Arguments[i]);
                }

                this.argumentFilter = filterMethod.Invoke(null, argumentsToFilterMethod) as IArgumentFilter;
            }
            else
            {
                object value;

                if (ValueExtractor.TryFindValueWithin(node, out value))
                {
                    this.argumentFilter = new IsArgumentFilter(value);
                }
            }

            return(node);
        }
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            var filterMethod = node
                .Method
                .DeclaringType
                .GetMethods(BindingFlags.Static | BindingFlags.NonPublic)
                .Where(x => x.Name == node.Method.Name + "Filter" && x.GetParameters().Length == node.Arguments.Count)
                .FirstOrDefault();

            if (filterMethod != null && filterMethod.ReturnType == typeof(IArgumentFilter))
            {
                if (node.Method.IsGenericMethod)
                {
                    filterMethod = filterMethod.MakeGenericMethod(node.Method.GetGenericArguments());
                }

                var argumentsToFilterMethod = new object[node.Arguments.Count];

                for (var i = 0; i < argumentsToFilterMethod.Length; ++i)
                {
                    argumentsToFilterMethod[i] = ValueExtractor.FindValueWithin(node.Arguments[i]);
                }

                this.argumentFilter = filterMethod.Invoke(null, argumentsToFilterMethod) as IArgumentFilter;
            }
            else
            {
                object value;

                if (ValueExtractor.TryFindValueWithin(node, out value))
                {
                    this.argumentFilter = new IsArgumentFilter(value);
                }
            }

            return node;
        }
Example #6
0
 public LogicalNotArgumentFilter(IArgumentFilter child)
 {
     Debug.Assert(child != null);
     this.child = child;
 }
        public override Expression Visit(Expression node)
        {
            if (node.NodeType == ExpressionType.Convert || node.NodeType == ExpressionType.Call)
            {
                return base.Visit(node);
            }

            object value;

            if (ValueExtractor.TryFindValueWithin(node, out value))
            {
                this.argumentFilter = new IsArgumentFilter(value);
                return node;
            }

            return node;
        }