[英]How to pass variables to Expression Func Projection before compile
[英]Evaluation Expression<Func<>> with variables
我们公司有一个框架,它请求作为 Expression(Func(T, bool)) 的查询,其中 T 是 Buiniess 对象的给定类型。
我需要为此编写一个提供程序以及评估表达式内容的内容
如果我有以下查询:
Expression<Func<Person, bool>> expr;
expr = (p) => p.Name == "Smith";
这没问题,然后我可以使用表达式的 Body 属性给出以下结果
Body = {(p.Name == "Smith")}
如果我使用这样的变量:
Expression<Func<Person, bool>> expr;
string nameToFind = "Smith";
expr = (p) => p.Name == name;
我得到以下结果:
Body = {(p.Name == value(TestConsole.Program+<>c__DisplayClass0_0).nameToFind)}
在这种情况下,我想要的是解析表达式中的变量值,就像第一个没有变量的例子一样。
这可能吗? 对于示例或提示,我将非常感谢
您想要做的是替换任何左侧为ConstantExpression
类型的MemberExpression
,使用反射来获取值。 这就是ExpressionVisitor
目的。
public class Simplify : ExpressionVisitor{
protected override Expression VisitMember(MemberExpression node){
var expr = Visit(node.Expression);
if (expr is ConstantExpression c){
if (node.Member is PropertyInfo prop)
return Expression.Constant(prop.GetValue(c.Value), prop.PropertyType);
if (node.Member is FieldInfo field)
return Expression.Constant(field.GetValue(c.Value), field.FieldType);
}
return node.Update(expr);
}
}
expr = new Simplify().Visit(expr);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.