为什么C#.net中的Expression的Body不能使用int,double或bool类型的属性?

我有一个function:

private string GetPropertyName(Expression<Func> f) { if ((f.Body as MemberExpression) != null) { return (f.Body as MemberExpression).Member.Name; } return ""; } 

它以这种方式使用:

 string x1 = GetPropertyName(x => Property1); string x2 = GetPropertyName(x => Property2); string x3 = GetPropertyName(x => Property3); 

其中Property1是一个int,Property2是一个字符串,Property3是一个对象……

仅正确返回类型字符串和对象的Property2和Property3的名称,但Property1的f.Body作为MemberExpression为空…

为什么会这样,我们如何更改代码,以便函数正确返回属性的名称?

我想问题是x => Property1表达式包含隐式强制转换为对象。 编译器添加此类强制转换以满足GetPropertyName的参数。

你应该检查这个演员表

 private string GetPropertyName(Expression> f) { var body = f.Body; if (body.NodeType==ExpressionType.Convert) body = ((UnaryExpression) body).Operand; if ((body as MemberExpression) != null) { return (body as MemberExpression).Member.Name; } return ""; } 

在封面下发生了一个装箱操作: int装箱以便作为一个object传递。

为了避免进一步的问题,我建议您更改方法的签名并使其通用:

 private string GetPropertyName(Expression> f) { // ... } 

这完全没有经过测试,但它可以解决您的问题; generics的使用应该避免包装或转换任何东西的必要性(隐含地)。

int,double和bool是C#中的本机类型 – 也就是说,它们根本不是对象。 换句话说,int没有类定义 – 它是原始内存中值的解释。 因此,您可以对从派生自Object的类执行的所有方法调用都会失败。 我对C#的内省能力并不熟悉,所以我担心我不能就如何修复它给你具体的建议。