[英]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.