是否可以转换字符串
"value > 5 && value <= 10"
到if语句?
if (value > 5 && value <= 10)
{
//do something
}
我将条件以字符串形式存储在数据库中,因此它必须是动态转换
答案 0 :(得分:3)
相反,您可以将其视为javascript行,并可以使用Windows Script Engines完成,前提是值是实际值而不是变量名。
if(ScriptEngine.Eval("jscript", "value > 5 && value <= 10"))
{
//Your logic
}
或者如果它是一个变量,那么您可以构建一个如下所示的JS函数来实现此目的:
using (ScriptEngine engine = new ScriptEngine("jscript"))
{
string JSfunction = "MyFunc(value){return " + "value > 5 && value <= 10" + "}";
ParsedScript parsed = engine.Parse(JSfunction);
if(parsed.CallMethod("MyFunc", 3))
{
// Your Logic
}
}
答案 1 :(得分:1)
您可以使用Linq.Expression
构建您提供的表达式树:
"value > 5 && value <= 10"
var val = Expression.Parameter(typeof(int), "x");
var body = Expression.And(
Expression.MakeBinary(ExpressionType.GreaterThan, val, Expression.Constant(5)),
Expression.MakeBinary(ExpressionType.LessThanOrEqual, val, Expression.Constant(10)));
var lambda = Expression.Lambda<Func<int, bool>>(exp, val);
bool b = lambda.Compile().Invoke(6); //true
bool b = lambda.Compile().Invoke(11); //false
这只是一个示例,可以使您有所了解,但您仍然需要一种聪明的方法来解析和构建树。
答案 2 :(得分:0)
恐怕您将不得不为此创建一个简单的解析器。
您可以尝试使用类似FParsec的名称。这是一个F#解析器库。我不知道C#中的此类代码
答案 3 :(得分:0)
使用Compute
的{{1}}方法:
System.Data.DataTable
用法
static class ExpressionHelper
{
private static readonly DataTable dt = new DataTable();
private static readonly Dictionary<string, string> expressionCache = new Dictionary<string, string>();
private static readonly Dictionary<string, object> resultCache = new Dictionary<string, object>();
// to be amended with necessary transforms
private static readonly (string old, string @new)[] tokens = new[] { ("&&", "AND"), ("||", "OR") };
public static T Compute<T>(this string expression, params (string name, object value)[] arguments) =>
(T)Convert.ChangeType(expression.Transform().GetResult(arguments), typeof(T));
private static object GetResult(this string expression, params (string name, object value)[] arguments)
{
foreach (var arg in arguments)
expression = expression.Replace(arg.name, arg.value.ToString());
if (resultCache.TryGetValue(expression, out var result))
return result;
return resultCache[expression] = dt.Compute(expression, string.Empty);
}
private static string Transform(this string expression)
{
if (expressionCache.TryGetValue(expression, out var result))
return result;
result = expression;
foreach (var t in tokens)
result = result.Replace(t.old, t.@new);
return expressionCache[expression] = result;
}
}