public static string GetExpressionInfo(Expression expression, ExpressionInfo expressionInfo) { string fullPath; var memberExpression = expression as MemberExpression; if (memberExpression != null) { if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess || memberExpression.Expression.NodeType == ExpressionType.Call) { if (memberExpression.Member.DeclaringType.IsNullable()) { // it's a Nullable<T>, so ignore any .Value if (memberExpression.Member.Name == "Value") { fullPath = GetExpressionInfo(memberExpression.Expression, expressionInfo); expressionInfo.FullPath = fullPath; return(fullPath); } } fullPath = GetExpressionInfo(memberExpression.Expression, expressionInfo) + "." + memberExpression.Member.Name; expressionInfo.FullPath = fullPath; expressionInfo.AddSubExpression(memberExpression); return(fullPath); //return GetExpressionInfo(memberExpression.Expression) + "." + memberExpression.Member.Name; } if (IsConversion(memberExpression.Expression.NodeType)) { fullPath = (GetExpressionInfo(memberExpression.Expression, expressionInfo) + "." + memberExpression.Member.Name).TrimStart('.');; expressionInfo.FullPath = fullPath; expressionInfo.AddSubExpression(memberExpression); return(fullPath); //return (GetExpressionInfo(memberExpression.Expression) + "." + memberExpression.Member.Name).TrimStart('.'); } fullPath = memberExpression.Member.Name; expressionInfo.FullPath = fullPath; expressionInfo.AddSubExpression(memberExpression); return(fullPath); //return memberExpression.Member.Name; } var unaryExpression = expression as UnaryExpression; if (unaryExpression != null) { if (!IsConversion(unaryExpression.NodeType)) { throw new Exception("Cannot interpret member from " + expression); } fullPath = GetExpressionInfo(unaryExpression.Operand, expressionInfo); expressionInfo.FullPath = fullPath; return(fullPath); //return GetExpressionInfo(unaryExpression.Operand); } var methodCallExpression = expression as MethodCallExpression; if (methodCallExpression != null) { /* * if (methodCallExpression.Method.Name == "GetType") * return ClassMember(methodCallExpression.Object); */ if (methodCallExpression.Method.Name == "get_Item") { fullPath = GetExpressionInfo(methodCallExpression.Object, expressionInfo); expressionInfo.FullPath = fullPath; return(fullPath); //return GetExpressionInfo(methodCallExpression.Object); } if (methodCallExpression.Method.Name == "First") { fullPath = GetExpressionInfo(methodCallExpression.Arguments[0], expressionInfo); expressionInfo.FullPath = fullPath; return(fullPath); //return GetExpressionInfo(methodCallExpression.Arguments[0]); } throw new Exception("Unrecognised method call in expression " + methodCallExpression); } if (expression is ParameterExpression) { return(""); } throw new Exception("Could not determine member from " + expression); }