/// <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(", ")); } }
/// <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); }
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); }