【问题标题】:Expression tree, how do I switch over the returned data type (string, int, float)表达式树,如何切换返回的数据类型(string、int、float)
【发布时间】:2012-09-20 06:59:29
【问题描述】:

我正在重写具有脚本支持的现有模板解决方案以作为表达式树运行,而不是在每次执行时都解释 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":
            }
    }
}

*更新 * 更改标题

【问题讨论】:

    标签: c# types expression-trees


    【解决方案1】:

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

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

    如果您添加一个特定的(但可能是无效的)您正在尝试做的事情的示例,我可以根据您的场景进行编辑以充实它,但目前它非常模糊。

    【讨论】:

    • 我正在使用表达式构建树。语法,但我发现无法切换表达式结果的类型。如果我有一个加法或乘法或连接,我将如何切换结果的类型(int、float、string),而不是表达式的类型(加法、乘法、连接)?
    • 我将在今天晚些时候尝试创建一个示例。
    • 当我尝试重做它作为示例时,我发现我想做的事情在表达式树中几乎是不可能的,所以我放弃了解决方案并重新开始了一个新的设计。
    【解决方案2】:

    解决方案是改变设计。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      相关资源
      最近更新 更多