示例#1
0
        /// <summary>
        /// Tests the expression.
        /// </summary>
        private static void TestExpression <TDelegate>(Expression <TDelegate> expression, params ExpressionType[] expectedExpressionTypes)
        {
            var flattener = new ExpressionFlattener(expression.Body, ExpressionType.Constant, ExpressionType.Parameter, ExpressionType.MemberAccess);
            var failed    = false;

            if (expectedExpressionTypes.Length != flattener.Expressions.Count())
            {
                failed = true;
            }
            else
            {
                for (var i = 0; i < expectedExpressionTypes.Length; i++)
                {
                    if (!flattener.Expressions.Select(x => x.NodeType).Contains(expectedExpressionTypes[i]))
                    {
                        failed = true;
                        break;
                    }
                }
            }
            if (failed)
            {
                Assert.Fail("Expression \"{0}\" should have found expressions \"{1}\", but instead found expressions of type \"{2}\"",
                            expression, expectedExpressionTypes.Select(xt => xt.ToString()).ConcatStrings(", "),
                            flattener.Expressions.Select(x => x.NodeType.ToString()).ConcatStrings(", "));
            }
        }
示例#2
0
        /// <summary>
        /// Extracts any dependencies within the specified LINQ expression.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <returns></returns>
        public IEnumerable<IDependencyDefinition> Extract(Expression expression)
        {
            var results = new List<IDependencyDefinition>();

            // Find the root member access expressions
            var analyser = new ExpressionFlattener(expression, ExpressionType.MemberAccess);
            var memberExpressions = analyser.Expressions;

            // Turn each one into the appropriate dependency
            foreach (var childExpression in analyser.Expressions)
            {
                var traverse = false;
                var currentExpression = childExpression;
                string propertyPath = null;

                if (childExpression is MemberExpression)
                {
                    var childMemberExpression = (MemberExpression) childExpression;
                    propertyPath = childMemberExpression.Member.Name;
                    currentExpression = childMemberExpression.Expression;
                    traverse = true;
                    while (true)
                    {
                        if (currentExpression is MemberExpression)
                        {
                            var nextMemberExpression = (MemberExpression) currentExpression;
                            propertyPath = nextMemberExpression.Member.Name + "." + propertyPath;
                            if (nextMemberExpression.Expression != null)
                            {
                                currentExpression = nextMemberExpression.Expression;
                                continue;
                            }
                        }
                        break;
                    }
                }

                if (currentExpression != null)
                {
                    var dependency = ExtractFromRoot(currentExpression, propertyPath);
                    if (dependency != null)
                    {
                        results.Add(dependency);
                    }
                    else if (traverse)
                    {
                        results.AddRange(Extract(currentExpression));
                    }
                }
            }
            return results;
        }
        /// <summary>
        /// Extracts any dependencies within the specified LINQ expression.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <returns></returns>
        public IEnumerable <IDependencyDefinition> Extract(Expression expression)
        {
            var results = new List <IDependencyDefinition>();

            // Find the root member access expressions
            var analyser = new ExpressionFlattener(expression, ExpressionType.MemberAccess);

            // Turn each one into the appropriate dependency
            foreach (var childExpression in analyser.Expressions)
            {
                var    traverse          = false;
                var    currentExpression = childExpression;
                string propertyPath      = null;

                if (childExpression is MemberExpression)
                {
                    var childMemberExpression = (MemberExpression)childExpression;
                    propertyPath      = childMemberExpression.Member.Name;
                    currentExpression = childMemberExpression.Expression;
                    traverse          = true;
                    while (true)
                    {
                        if (currentExpression is MemberExpression)
                        {
                            var nextMemberExpression = (MemberExpression)currentExpression;
                            propertyPath = nextMemberExpression.Member.Name + "." + propertyPath;
                            if (nextMemberExpression.Expression != null)
                            {
                                currentExpression = nextMemberExpression.Expression;
                                continue;
                            }
                        }
                        break;
                    }
                }

                if (currentExpression != null)
                {
                    var dependency = ExtractFromRoot(currentExpression, propertyPath);
                    if (dependency != null)
                    {
                        results.Add(dependency);
                    }
                    else if (traverse)
                    {
                        results.AddRange(Extract(currentExpression));
                    }
                }
            }
            return(results);
        }
示例#4
0
        public IEnumerable <IDependencyDefinition> Extract(Expression expression)
        {
            var list = new List <IDependencyDefinition>();
            var expressionFlattener = new ExpressionFlattener(expression, ExpressionType.MemberAccess);

            foreach (var expression3 in expressionFlattener.Expressions)
            {
                var    flag        = false;
                var    expression2 = expression3;
                string text        = null;
                if (expression3 is MemberExpression memberExpression)
                {
                    text        = memberExpression.Member.Name;
                    expression2 = memberExpression.Expression;
                    flag        = true;
                    while (true)
                    {
                        if (!(expression2 is MemberExpression))
                        {
                            break;
                        }
                        var memberExpression2 = (MemberExpression)expression2;
                        text = memberExpression2.Member.Name + "." + text;
                        if (memberExpression2.Expression == null)
                        {
                            break;
                        }
                        expression2 = memberExpression2.Expression;
                    }
                }

                if (expression2 == null)
                {
                    continue;
                }
                var dependencyDefinition = ExtractFromRoot(expression2, text);
                if (dependencyDefinition != null)
                {
                    list.Add(dependencyDefinition);
                }
                else if (flag)
                {
                    list.AddRange(Extract(expression2));
                }
            }
            return(list);
        }