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

The*_*rer 0 .net 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"
Run Code Online (Sandbox Code Playgroud)

但是,如果您将匿名类型的属性传递给它,它会引发空引用异常,因为表达式主体是 UnaryExpression 而不是 MemberExpression。

如何使此函数对匿名类型正常工作?

Dou*_*las 5

表达式主体UnaryExpression不是因为匿名类型,而是因为属性是一个值类型,需要装箱object为您的Expression<Func<object>>; 看到这个答案

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

public static string GetPropertyName<T>(this Expression<Func<T>> property)
Run Code Online (Sandbox Code Playgroud)