我正在重写现有的模板解决方案,脚本支持作为表达式树运行,而不是每次执行都解释AST,逻辑必须使用现有的脚本。
我现在想要实现的是创建一个测试真实的解决方案。
实施例。 null为空的字符串被视为false,因为0和任何十进制值的绝对值低于0.0001。 “true”和“false”是他们所说的,不区分大小写,字符串“null”是假的。
唯一有效的输入类型是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":
}
}
}
* 更新* 更改了标题
答案 0 :(得分:2)
调用现有表达式树的表达式树是调用静态方法的一种非常不同的场景。两者都是可能的 - 它是Expression.Call
(调用方法)和Expression.Invoke
(调用表达式树)之间的区别。请注意,在某些情况下,最好通过ExpressionVisitor
合并这两棵树。
switch
是tricker - 有Expression.Switch
,但c#编译器不包含对这些表达式的支持,因此您必须通过Expression
方法完全手动创建这些表达式。
如果你添加一个特定的(但可能是非工作的)你想要做的事情的例子,我可以编辑为你的场景充实它,但目前它很模糊。
答案 1 :(得分:0)
解决方案是改变设计。
我的问题是我在运行时尝试在错误的时间进行演员表,但表达式树无法以一种好的方式处理它。
我完全重新设计了解析器以使用强类型方法和变量以及显式转换,并且事实证明转换为表达式树更容易。