代码之家  ›  专栏  ›  技术社区  ›  Jronny

为什么C#.net中的表达式体不能使用int、double或bool类型的属性?

  •  1
  • Jronny  · 技术社区  · 16 年前

    private string GetPropertyName(Expression<Func<object, object>> 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是对象。。。

    仅正确返回类型分别为string和object的Property2和Property3的名称,但Property1的f.Body作为MemberExpression为null。。。

    3 回复  |  直到 16 年前
        1
  •  9
  •   Denis K    16 年前

    我想问题在于 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 "";
    }
    
        2
  •  3
  •   Bryan Menard    16 年前

    有一个 暗箱操作: int 盒装 为了通过考试 object .

    private string GetPropertyName<T, TResult>(Expression<Func<T, TResult>> f) {
        // ...
    }
    

    这是完全未经测试,但它应该解决您的问题;使用泛型应该避免 箱 或转换任何内容(隐式)。

        3
  •  -4
  •   Matt    16 年前

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