gpt4 book ai didi

C# 表达式树 - 动态值查找

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:54 24 4
gpt4 key购买 nike

我正在构建一个 C# 表达式树来计算简单的表达式。表达式字符串被解析为树,并通过使用括号尊重基本运算符(数学、逻辑和关系)以及优先级。

除了 bool、string 和 integer 类型之外,我还需要在运行时计算表达式的某些元素。这些由模板化字符串表示,例如:

([firstname] == "bob") && ([surname] == "builder")

上面的表达式将针对(可能很大)数量的对象进行评估,这些对象为当前表达式调用提供上下文,例如,在循环中。模板部分将在当前上下文中被反射使用——例如当前用户的名字和姓氏将在示例中解析,这些值将用于表达式解析而不是模板化字符串。

一种解决方案是在解析时解析模板值,这样可以使用常量表达式类型并且值的类型是已知的。但是,每次使用都重新构建和重新编译表达式树会对性能产生不利影响。

所以,我需要一个表达式类型,它:- 值类型在解析时未知,并且- 在调用时通过方法调用解决

E.g. Desired example of usage in pseudo code
ExpressionParser parser = new ExpressionParser(); // parses and builds expression trees
MyParsedExpression expression = parser.Parse("([firstname] == 'bob') && ([surname] == 'builder'"); // wrapper for the parsed expression
foreach (Object user in users)
{
expression.Context = user;
Boolean result = expression.EvaluateTruth();
if (result == true)
{
// do something
}
}

谢谢,龟

最佳答案

使用ParameterExpression 来表示传入的参数。至于类型异常……你在构建表达式树的时候知道数据的类型吗?如果不是,那确实会让事情变得更加困难......

如果对你有用,我回复了similar question最近,有了一些源代码。它可能不会立即对您有用,但它应该是一个好的开始。

编辑:我不确定表达式树在这里对您有多大用处。特别是 PropertyExpression 包含相关的 PropertyInfo,因此它需要知道它正在使用的类型。如果每个值的类型都可能发生变化,则您必须为每个值重建表达式树...

关于C# 表达式树 - 动态值查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1254920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com