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

在方法中传递Linq实体的属性以设置和获取结果

  •  3
  • Spence  · 技术社区  · 15 年前

    我正在尝试传入要由我的方法使用的Linq实体的属性。我可以很容易地传递一个要查询的属性

    Func<Entities.MyEntity, ResultType> GetProperty = ent => ent.Property;
    

    但是,这将返回resultType,并且不能用于设置属性。

    我考虑过使用反射来获取PropertyInfo,但这会让我获取属性,但随后我就不能使用Linq语法来调用我的属性。有没有大师知道怎么做?

    我有一种预感,我可以通过构造一块表达式树并将其应用到查询中…

    我真的希望能做点什么:

    var value = myQueryEntity.CallMagicFunction();  //typesafe
    myQueryEntity.CallMagicFunction() = value; //typesafe
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   Marc Gravell    15 年前

    事实上,表达式树应该有效;因为 基本的 成员访问(直接离开对象的字段/属性):

    static MemberInfo ReadMember(LambdaExpression expr)
    {
        if(expr == null) throw new ArgumentNullException("expr");
        MemberExpression me = expr.Body as MemberExpression;
        if(me == null || !ReferenceEquals(me.Expression, expr.Parameters[0])) {
            throw new ArgumentException("expr");
        }
        return me.Member;
    }
    

    具有

    Expression<Func<Customer, int>> func = c => c.Id;
    MemberInfo member = ReadMember(func);
    // for simplicity assume prop:
    PropertyInfo prop = (PropertyInfo)member;
    

    从那里你几乎可以做任何事情,特别是你可以得到 get / set 访问器(如果要创建委托),或使用 GetValue / SetValue .

    请注意,在.NET 4.0中,可以直接在 Expression (但是C编译器 为这个添加任何额外的支持,所以你需要自己写 表情 用手)。