C#将字符串转换为if条件

时间:2019-07-04 13:50:54

标签: c# .net

是否可以转换字符串

"value > 5 && value <= 10" 

到if语句?

if (value > 5 && value <= 10)
{
   //do something
}

我将条件以字符串形式存储在数据库中,因此它必须是动态转换

4 个答案:

答案 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;
    }
}