从表达式中获取属性名称的方法

12

我有一个名为Test的类:

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

而函数Exec接受表达式:

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

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

如何获取表达式中使用的属性名称?在上面的代码中,应该是Id。

重复的问题:从Lambda表达式中检索属性名称 - CodeCaster
1个回答

21

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());
    }
}

使用:

public void Exec<T>(Expression<Func<T, object>> expression)
{
    string name = GetMemberName(expression.Body);
    // ...
}

抱歉,在我的情况下,我总是得到异常InvalidCastException。"无法将System.Linq.Expressions.UnaryExpression强制转换为类型System.Linq.Expressions.MemberExpression"。 - alexmac
1
@Alexander 添加了对“Convert”表达式的支持。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接