Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从表达式中获取匿名类型属性的属性名_C#_.net_Lambda_Expression - Fatal编程技术网

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

C# 从表达式中获取匿名类型属性的属性名,c#,.net,lambda,expression,C#,.net,Lambda,Expression,以下代码适用于常规类型: public static string GetPropertyName(this Expression<Func<object>> property) { MemberExpression member = property.Body as MemberExpression; PropertyInfo propInfo = member.Member as PropertyInfo;

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

    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"
公共静态字符串GetPropertyName(此表达式属性)
{
MemberExpression member=property.Body作为MemberExpression;
PropertyInfo-propInfo=成员。成员为PropertyInfo;
返回propInfo.Name;
}
GetPropertyName(()=>obj.MyProperty)//返回“MyProperty”
但是,如果您从匿名类型向它传递属性,它将抛出null引用异常,因为表达式体是一个UnaryExpression而不是MemberExpression


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

表达式主体是
UnaryExpression
,这不是因为匿名类型,而是因为属性是一种值类型,需要作为
表达式的
对象
装箱;看

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

public static string GetPropertyName<T>(this Expression<Func<T>> property)
公共静态字符串GetPropertyName(此表达式属性)

表达式主体是一个
UnaryExpression
,这不是因为匿名类型,而是因为属性是一个值类型,需要为您的
表达式作为
对象
装箱;看

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

public static string GetPropertyName<T>(this Expression<Func<T>> property)
公共静态字符串GetPropertyName(此表达式属性)