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

时间:2010-02-01 06:56:09

标签: c# .net linq

我正在尝试传递我的方法使用的Linq实体的属性。我可以轻松传递要查询的属性

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

但是这会返回ResultType,不能用于设置属性。

我想过使用反射获取一个propertyInfo,但是这会让我获取属性但是我不能使用Linq语法来调用我的属性。那里有没有知道怎么做的大师?

我有预感,我可以通过构建表达式树的一大块并将其应用到查询中来实现...

我真的希望做类似的事情:

var value = myQueryEntity.CallMagicFunction();  //typesafe
myQueryEntity.CallMagicFunction() = value; //typesafe

1 个答案:

答案 0 :(得分:3)

确实,表达树应该有效;对于基本成员访问(直接在对象外的字段/属性):

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#编译器为此添加任何额外支持,因此您需要编写你自己的Expression手。)