2012-09-20 43 views
1

我重写与脚本支持现有的模板溶液作为表达式树,而不是解释AST每个执行的运行和所述逻辑具有对使用现有的脚本。的表达式树,如何切换对于返回的数据类型(字符串,整数,浮点)

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

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

唯一有效的输入类型是float,int,string和bool。要编译可以工作到表达式树

任何解决方案是有效的,我已经有一个现成的方法来测试一个对象,但无法找到任何很好的例子调用外部方法。

每个例子都可以使用常量值或不接受任何参数。

更新

我建立使用“Expression.ABC”方法树,但有一个问题,资金的方式在结果的表达式的类型(字符串,整数,浮点)可切换树。

当前语法存储一切为字符串并解析成int,并根据操作浮动,如果失败返回默认值。

其内置的是故障安全和总是成功的,产生的结果,即使在模板语法错误提供。

更新

实施例(不是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": 
      } 
    } 
} 

* 更新*改变标题

回答

0

解决方案是改变设计。

我的问题是,我试图做我的演员在错误的时间,在运行时间,但表达式树无法处理的一个好办法。

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

2

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

switch是窍门 - 有Expression.Switch,但c#编译器不包括对这些表达式的支持,因此您必须通过Expression方法完全手动创建这些表达式。

如果你添加了一个特定的(但可能是非工作的)你正在做的事情的例子,我可以编辑它为你的场景充实,但目前它非常含糊。

+0

我正在使用表达式构建树。语法,但我找不到切换表达式结果类型的方法。如果我有一个Add或multiply或concatenation,我将如何切换结果的类型(int,float,string),而不是表达式的类型(Add,Multiply,concat)? –

+0

今天晚些时候我会试着创建一个例子。 –

+0

当我试图重新将它作为一个例子时,我发现我想做的事情在表达式树中几乎不可能做到,所以我放弃了解决方案,并开始使用新的设计。 –

相关问题