我正在尝试传递我的方法使用的Linq实体的属性。我可以轻松传递要查询的属性
Func<Entities.MyEntity, ResultType> GetProperty = ent => ent.Property;
但是这会返回ResultType,不能用于设置属性。
我想过使用反射获取一个propertyInfo,但是这会让我获取属性但是我不能使用Linq语法来调用我的属性。那里有没有知道怎么做的大师?
我有预感,我可以通过构建表达式树的一大块并将其应用到查询中来实现...
我真的希望做类似的事情:
var value = myQueryEntity.CallMagicFunction(); //typesafe
myQueryEntity.CallMagicFunction() = value; //typesafe
答案 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
手。)