using System.Linq.Expressions;
using System.Collections.Generic;
public static void Main()
Customer customer = null;
string expressionAdresses2Number = Program.PathString(() => customer.Adresses[2].Number);
Console.WriteLine("Wrong - Expected: Adresses[2].Number, Actual: " + expressionAdresses2Number);
public static IReadOnlyList<MemberInfo> Get(LambdaExpression expression)
var visitor = new PropertyVisitor();
visitor.Visit(expression.Body);
public static string PathString(Expression<Func<object>> expression)
return string.Join(".", Get(expression).Select(x => x.Name));
public class PropertyVisitor : ExpressionVisitor
internal readonly List<MemberInfo> Path = new List<MemberInfo>();
protected override Expression VisitMember(MemberExpression node)
if ((node.Member is PropertyInfo))
this.Path.Add(node.Member);
return base.VisitMember(node);
public int Id { get; set; }
public Adress Adress { get; set; }
public IList<Adress> Adresses { get; set; }
public int Id { get; set; }
public int Number { get; set; }