1

我正在重写具有脚本支持的现有模板解决方案以作为表达式树运行,而不是在每次执行时都解释 AST,并且逻辑必须与现有脚本一起使用。

我现在想要实现的是创建一个解决方案来测试真实性。

前任。为 null 或空的字符串被视为 false,因为 0 和绝对值低于 0.0001 的任何十进制值。“true”和“false”就是他们所说的,不区分大小写,字符串“null”为false。

唯一有效的输入类型是 float、int、string 和 bool。

任何可以用于要编译的表达式树的解决方案都是有效的,我已经有一个现有的方法来测试一个对象,但找不到任何好的例子来调用外部方法。

每个示例要么适用于常量值,要么不接受任何参数。

更新

我正在使用“Expression.ABC”方法构建树,但在资助一种方法来切换表达式树的结果类型(字符串、整数、浮点数)时遇到问题。

当前语法将所有内容存储为字符串并根据操作解析为 int 和 float,如果失败则返回默认值。

它构建为故障安全并且始终成功生成结果,即使在模板中提供了错误的语法。

更新

示例(不是 100 % 准确,而是举例说明当前的解释器)

string Evaluate(Expr e) {
    switch(Expr.Type) {
        case "istrue":
            ExprValue value = Evaluate(Expr.Child);
            switch(value.Type) {
                case "String":
                    if(String.IsNullOrWhiteSpace(value.ToString()) || value.ToString().ToLower() == "false" || value.ToString().ToLower() == "null" || value.ToInt() == 0) return false;

                case "Int":
                    return value.ToInt() != 0;
                case "Float":
            }
    }
}

*更新 *更改标题

4

2 回答 2

2

调用现有表达式树的表达式树与调用静态方法是完全不同的场景。Expression.Call两者都是可能的 - 这是(调用方法)和Expression.Invoke(调用表达式树)之间的区别。请注意,在某些情况下,最好通过ExpressionVisitor.

switch更狡猾 - 有Expression.Switch,但 c# 编译器不支持这些表达式,因此您必须通过这些Expression方法完全手动创建这些表达式。

如果您添加一个特定(但可能无效)的示例来说明您正在尝试做什么,我可以对其进行编辑以针对您的场景进行充实,但目前它非常模糊。

于 2012-09-20T07:10:24.113 回答
0

解决方案是改变设计。

我的问题是我试图在错误的时间,在运行时进行演员表,但表达式树无法很好地处理它。

我完全重新设计了解析器,使其具有强类型的方法和变量以及显式强制转换,事实证明这更容易转换为表达式树。

于 2012-12-05T12:52:07.233 回答