using System.Linq.Expressions;
public string Bar {get;set;}
public object Baz { get; set; }
public object Baa() => 100;
var myFoo = new Foo { Baz = 5 };
myFoo.Evaluate(f => f.Bar);
myFoo.Evaluate(f => f.Baz);
myFoo.Evaluate(f => f.Boo);
myFoo.Evaluate(f => f.Baa());
public static class ObjectExtensions{
public static void Evaluate<T>(this T obj, Expression<Func<T, object>> expr){
var prop = (expr.Body as MemberExpression)?.Member as PropertyInfo;
var val = prop?.GetValue(obj);
Console.WriteLine($"{prop.Name} is of type {prop.PropertyType} containing a {val.GetType()} with value {val}");
Console.WriteLine($"{expr.Body} is not a PropertyExpression, but a {expr.Body.GetType()}");
Console.WriteLine($"{prop?.Name} is of type {prop?.PropertyType} containing NULL");