using System.Linq.Expressions;
using System.Collections.Generic;
public static void Main()
var p = new Person { FirstName = "Bill", LastName= "Gates", MiddleName = string.Empty, Age = 62};
Console.WriteLine(Extensions.GetName(() => p.FirstName));
Console.WriteLine(Extensions.GetName(() => p.LastName));
Console.WriteLine(Extensions.GetName(() => p.Age));
Console.WriteLine(Extensions.GetName(() => p.Birthdate));
Console.WriteLine(Extensions.GetName(() => p.Parents));
Console.WriteLine(Extensions.GetName(() => p.Age.ToString()));
Console.WriteLine(Extensions.EnsureNotNullOrEmpty(() => p.FirstName));
Console.WriteLine(Extensions.EnsureNotNullOrEmpty(() => p.LastName));
Console.WriteLine(Extensions.EnsureNotNullOrEmpty(() => p.MiddleName));
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public DateTime Birthdate { get; set; }
public List<Person> Parents { get; set; }
public static class Extensions
public static string GetName<T>(this Expression<Func<T>> action)
return GetNameFromMemberExpression(action.Body);
static string GetNameFromMemberExpression(Expression expression) {
if (expression is MemberExpression) {
return (expression as MemberExpression).Member.Name;
else if (expression is UnaryExpression) {
return GetNameFromMemberExpression((expression as UnaryExpression).Operand);
return "MemberNameUnknown";
public static bool EnsureNotNullOrEmpty(Expression<Func<string>> member)
var memberValue = member.Compile()();
if (string.IsNullOrEmpty(memberValue.ToString()))
throw new ArgumentException($"This property cannot be null or empty.", member.GetName());