当前位置: 首页 > 编程语言 > C#

如何在运行时计算表达式参数?分享

时间:2023-04-10 14:58:49 C#

如何在运行时计算表达式参数?我需要解决的问题是通过一个IF语句来运行数据。IF语句由SQL表在运行时生成。我已经设法通过使用表达式和Lambda表达式来做到这一点。我的表有memberName;手术;目标。例如,我从表中获取“Age”、“GreaterThan”和“40”,然后对其进行编译。varrule=newRule(rowRule["memberName"].ToString(),rowRule["Operator"].ToString(),rowRule["目标"].ToString());FunccompiledRule=CompileRule(规则);我得到一个true或false值,它完美地工作。publicstaticFuncCompileRule(Ruler){varparamUser=Expression.Parameter(typeof(User));表达式expr=BuildExpr(r,paramUser);//构建一个lambda函数User->bool并编译它returnExpression.Lambda(expr,paramUser).Compile();}staticExpressionBuildExpr(Ruler,ParameterExpressionparam){varleft=MemberExpression.Property(param,r.MemberName);vartProp=typeof(T).GetProperty(r.MemberName).PropertyType;表达式类型tBinary;//该运算符是已知的.NET运算符吗?如果(ExpressionType.TryParse(r.Operator,outtBinary)){varright=Expression.Constant(Convert.ChangeType(r.TargetValue,tProp));//使用二元运算,例如'Equal'->'u.Age==15'returnExpression.MakeBinary(tBinary,left,right);}else{varmethod=tProp.GetMethod(r.Operator);vartParam=method.GetParameters()[0].ParameterType;varright=Expression.Constant(Convert.ChangeType(r.TargetValue,tParam));//使用方法调用,例如'包含'->'u.Tags.Contains(some_tag)'returnExpression.Call(left,method,right);这适用于像“Age>30”这样的简单if语句,但现在我需要传入if语句以使其更复杂,例如我需要处理像“Age>(30/2)”这样的语句任何人都知道如何调整我的规则引擎以能够进行计算如果我可以解析目标值,我从表中获取代码并在方法中执行它并返回单个值然后创建规则,但我不知道如何在运行时获取字符串,将其解析为代码并执行。我走下了表达式树的兔子洞,认为这可能是我的答案,但我开始意识到表达式树只是一个可视化数据结构,而不是要执行的代码。如果像这样的规则引擎已经存在就好了,但我还没有真正看到过类似的东西。以上是C#学习教程:如何在运行时计算表达式参数?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: