【发布时间】:2016-12-01 06:31:13
【问题描述】:
我正在使用Flee 库来评估用户输入的表达式。我使用表达式无法编译的事实来警告用户输入无效。
如果我使用像 var=="something" 这样的表达式,如果 var 是 int,它将无法编译,因为这不是有效代码。
但如果 var 是我创建的自定义类的对象,它将编译(因为我猜该对象有一个 ToString 方法)。如果其中包含的变量无法与字符串进行比较,如何防止带有自定义类的表达式编译?
更新:这是一个显示问题的示例代码。 filter1 在尝试编译时会抛出错误消息:
Ciloci.Flee.ExpressionCompileException:CompareElement:没有为“Int32”和“String”类型定义“Equal”操作
但是使用自定义类作为变量类型而不是整数的第二个过滤器不会给出异常。但是我希望该自定义类的行为类似于 int 并且没有定义 Equal 操作。该怎么做?
using System;
using Ciloci.Flee;
namespace FleeTest
{
class VariableClass
{
// TODO
}
class Program
{
public static void Main(string[] args)
{
ExpressionContext context = new ExpressionContext();
context.Options.ResultType = typeof(bool);
VariableCollection var = context.Variables;
var.ResolveVariableType += var_ResolveVariableType;
string filter1 = "varInt=\"something\"";
string filter2 = "varClass=\"something\"";
try
{
IDynamicExpression e = context.CompileDynamic(filter1);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
try
{
IDynamicExpression e = context.CompileDynamic(filter2);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
static void var_ResolveVariableType(object sender, ResolveVariableTypeEventArgs e)
{
if(e.VariableName == "varInt")
{
e.VariableType = typeof(int);
}
else if(e.VariableName == "varClass")
{
e.VariableType = typeof(VariableClass);
}
}
}
}
【问题讨论】:
-
你能想出你正在使用的实际代码吗?
-
比较前检查变量类型。
-
如果你认为这是因为
ToString(),你可以覆盖它并在里面抛出一个错误。看看它是否有效。 -
我确实尝试在 ToSting() 中抛出错误,但这并没有帮助。该错误只会在运行代码时抛出,而不是在 Flee 库解析时抛出。我会尝试举一个最简单的例子来说明我的问题。
-
我现在用一些示例代码更新了这个问题,这些示例代码显示了我试图解决的问题。