使用Flee进行字符串字面量校验时遇变量识别错误问题
解决Flee字符串字面量被当作变量的问题
嘿,这个问题很典型——你写的表达式里,JWilly没有被当作字符串字面量处理,是因为Flee要求字符串必须用引号包裹,否则它会默认把无引号的标识符识别成变量名,而不是你要匹配的字符串值。
问题根源
你的表达式:
const string exp = @"(User.UserName = JWilly)";
这里的JWilly没有引号,Flee会尝试去查找名为JWilly的变量,但你根本没定义这个变量,所以运行时肯定会出错,或者得到不符合预期的结果。
修正方案
只需要给字符串字面量加上单引号(或者转义后的双引号)就行,两种写法都可以:
写法1:使用单引号(更简单,不需要转义)
var context = new ExpressionContext(); context.Variables.DefineVariable("User", typeof(User)); // 给JWilly加上单引号,标记为字符串字面量 const string exp = @"(User.UserName = 'JWilly')"; var expression = context.CompileDynamic(exp); var user = new User { Id = 1, UserName = "JWilly", Active = false, }; context.Variables["User"] = user; var result = expression.Evaluate();
写法2:使用转义双引号(适合习惯C#字符串写法的场景)
因为你用了@逐字字符串,所以双引号需要写两个来转义:
const string exp = @"(User.UserName = ""JWilly"")";
补充说明
Flee的表达式语法和C#类似,但在处理字符串时,必须显式用引号(单/双都可)标记字面量,这是为了区分变量名和字符串值。如果不加引号,解析器会把它当成一个需要求值的变量引用,自然就不符合你的预期啦。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

