有没有办法打破表达式<func <t,bool =“”>&gt;并获得相等比较的右侧?</func <t,>

时间:2015-02-23 12:35:45

标签: c# linq lambda expression equality

这可能是一个远景,但无论如何我都会尝试。

让我们说我有这样的表达方式:

public class Foo {
    public int Id { get; set; }
}

Expression<Func<Foo, bool>> expr = p => p.Id == 2;

有没有办法打破表达方式,让我们说:

  • 获取会员名称(expr.Body作为MemberExpression).Member.Name;

  • 并获得相等比较的右侧值。也就是说,2。

或者这不可能吗?

1 个答案:

答案 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
    }
}

这是......

请注意,这仅适用于最简单的情况,其中有一个简单BinaryExpressionMethodCallExpression Equals

但是,例如表达式是:

Expression<Func<Foo, bool>> expr = p => true;

...或

Expression<Func<Foo, bool>> expr = p => p.Id == 2 && something;

然后它将无效。