这可能是一个远景,但无论如何我都会尝试。
让我们说我有这样的表达方式:
public class Foo {
public int Id { get; set; }
}
Expression<Func<Foo, bool>> expr = p => p.Id == 2;
有没有办法打破表达方式,让我们说:
获取会员名称(expr.Body作为MemberExpression).Member.Name;
并获得相等比较的右侧值。也就是说,2。
或者这不可能吗?
答案 0 :(得分:5)
Expression<Func<Foo, bool>> expr = p => p.Id == 2; // Supports even p.Id.Equals(2)
BinaryExpression be = expr.Body as BinaryExpression;
if (be != null)
{
Expression left = be.Left;
Expression right = be.Right;
}
else
{
MethodCallExpression mc = expr.Body as MethodCallExpression;
if (mc != null && mc.Method.Name == "Equals" && mc.Arguments.Count == 1)
{
Expression obj = mc.Object; // "left"
Expression arg = mc.Arguments[0]; // "right"
}
else
{
// not supported
}
}
这是......
请注意,这仅适用于最简单的情况,其中有一个简单BinaryExpression
和MethodCallExpression
Equals
。
但是,例如表达式是:
Expression<Func<Foo, bool>> expr = p => true;
...或
Expression<Func<Foo, bool>> expr = p => p.Id == 2 && something;
然后它将无效。