作者:zhj808008 | 来源:互联网 | 2023-05-20 18:54
这可能是一个远景,但无论如何我都会尝试.
让我们说我有这样的表达方式:
public class Foo {
public int Id { get; set; }
}
Expression> expr = p => p.Id == 2;
有没有办法打破表达,让我们说:
获取成员名称(expr.Body作为MemberExpression).Member.Name;
并获得相等比较的右侧值.也就是说,2.
或者这不可能吗?
1> xanatos..:
Expression> 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> expr = p => true;
要么...
Expression> expr = p => p.Id == 2 && something;
然后它将无法正常工作.