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

Jro*_*nny 1 .net c# types expression properties

我有一个功能:

private string GetPropertyName(Expression<Func<object, object>> f) {
    if ((f.Body as MemberExpression) != null) {
        return (f.Body as MemberExpression).Member.Name;
    }
    return "";
}
Run Code Online (Sandbox Code Playgroud)

它以这种方式使用:

string x1 = GetPropertyName(x => Property1);
string x2 = GetPropertyName(x => Property2);
string x3 = GetPropertyName(x => Property3);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Den*_*s K 9

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

你应该检查这个演员表

private string GetPropertyName(Expression<Func<object, object>> 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 "";
}
Run Code Online (Sandbox Code Playgroud)