从表达式中获取匿名类型属性的属性名称

时间:2017-07-13 20:55:21

标签: c# lambda expression

以下代码适用于常规类型:

    public static string GetPropertyName(this Expression<Func<object>> property)
    {
        MemberExpression member = property.Body as MemberExpression;
        PropertyInfo propInfo = member.Member as PropertyInfo;
        return propInfo.Name;
    }

    GetPropertyName(() => obj.MyProperty); //Returns "MyProperty"

但是,如果从匿名类型传递属性,则会抛出空引用异常,因为表达式主体是UnaryExpression而不是MemberExpression。

如何使此功能适用于匿名类型?

1 个答案:

答案 0 :(得分:4)

表达式正文是UnaryExpression,不是因为匿名类型,而是因为该属性是一个值类型,需要为objectExpression<Func<object>>;见this answer

您可以通过更改方法签名来采用泛型类型参数来避免这种情况:

public static string GetPropertyName<T>(this Expression<Func<T>> property)