using System.Linq.Expressions;
using System.Collections.Generic;
public static void Main()
Expression<Func<Foo, C>> expr = x => x.A.B.C;
var visitor = new Visitor();
public class Visitor : ExpressionVisitor
public readonly Dictionary<Expression, string> lookup = new Dictionary<Expression, string>();
protected override Expression VisitMember(MemberExpression node)
var result = base.VisitMember(node);
Console.WriteLine("Visiting " + node);
if (lookup.TryGetValue(node.Expression, out var current))
lookup.Remove(node.Expression);
current += "." + node.Member.Name;
current = node.Member.Name;