10

I have class Test:

class Test
{
    public int Id {get;set;}
    public string Name {get;set;}
}

And function Exec which accepts expression:

void Exec<T>(Expression<Func<T, object>> expression)
{
}

...
Exec<Test>(t => t.Id);

How can I get the property name used in expression? In the code above this should be Id.

Jason Aller
  • 3,541
  • 28
  • 38
  • 38
alexmac
  • 19,087
  • 7
  • 58
  • 69
  • Duplicate of [Retrieving Property name from lambda expression](http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression). – CodeCaster Nov 11 '13 at 09:20

1 Answers1

20

Something like:

private static string GetMemberName(Expression expression)
{
    switch(expression.NodeType)
    {
        case ExpressionType.MemberAccess:
            return ((MemberExpression)expression).Member.Name;
        case ExpressionType.Convert:
            return GetMemberName(((UnaryExpression)expression).Operand);
        default:
            throw new NotSupportedException(expression.NodeType.ToString());
    }
}

with:

public void Exec<T>(Expression<Func<T, object>> expression)
{
    string name = GetMemberName(expression.Body);
    // ...
}
Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
  • Sorry, but in my case, I always got exception InvalidCastException. "Can't cast System.Linq.Expressions.UnaryExpression to type System.Linq.Expressions.MemberExpression" – alexmac Nov 11 '13 at 09:10
  • 1
    @Alexander added support for `Convert` expressions – Marc Gravell Nov 11 '13 at 09:29