.net - 在 .NET 中将复杂的 boolean 条件从字符串转换为 boolean 值

标签 .net string parsing boolean

我需要将复杂的表达式从字符串解析为 boolean 值。

它只能包含:
* boolean 值(真/假),
* 括号,
* AND/OR 操作数 (&&, ||)

例如:

bool.Parse("((true || false) && (false || false)) || (true || false)"

知道如何实现这一目标吗?

最佳答案

这是一个巧妙的评估器类,它为您提供 C# 代码中的 JScript.NET Eval 函数:

static public class Evaluator
{
    private const string _jscriptSource =
        @"package Evaluator
        {
           class Evaluator
           {
              public function Eval(expr : String) : String 
              { 
                 return eval(expr); 
              }
           }
        }";

    static private object _evaluator;
    static private Type _evaluatorType;

    [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline",
        Justification = "Can't be done inline - too complex")]
    static Evaluator()
    {
        InstantiateInternalEvaluator();
    }

    static private void InstantiateInternalEvaluator()
    {
        JScriptCodeProvider compiler = new JScriptCodeProvider();

        CompilerParameters parameters;
        parameters = new CompilerParameters();
        parameters.GenerateInMemory = true;

        CompilerResults results;
        results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource);

        Assembly assembly = results.CompiledAssembly;
        _evaluatorType = assembly.GetType("Evaluator.Evaluator");

        _evaluator = Activator.CreateInstance(_evaluatorType);
    }

    static public int EvaluateToInteger(string statement)
    {
        string s = EvaluateToString(statement);
        return int.Parse(s);
    }

    static public double EvaluateToDouble(string statement)
    {
        string s = EvaluateToString(statement);
        return double.Parse(s);
    }

    static public decimal ForceEvaluateToDecimal(string statement)
    {
        decimal result;
        bool s = Decimal.TryParse(statement, out result);
        return result;
    }

    static public decimal EvaluateToDecimal(string statement)
    {
        string s = EvaluateToString(statement);
        return decimal.Parse(s);
    }

    static public string EvaluateToString(string statement)
    {
        object o = EvaluateToObject(statement);
        return o.ToString();
    }

    static public bool EvaluateToBool(string statement)
    {
        object o = EvaluateToObject(statement);
        return (bool)o;
    }

    static public object EvaluateToObject(string statement)
    {
        try
        {
            return _evaluatorType.InvokeMember(
                "Eval",
                BindingFlags.InvokeMethod,
                null,
                _evaluator,
                new object[] {statement}
                );
        }
        catch (Exception)
        {
            InstantiateInternalEvaluator();
            return null;
        }
    }
}

然后您就可以调用 Evaluator.EvaluateToBool(string)。从现有项目中提取,因此您可能需要进行调整!

关于.net - 在 .NET 中将复杂的 boolean 条件从字符串转换为 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/690017/

相关文章:

c# - 卷影复制以免锁定程序集

.net - 使用起点 X/Y 和起点 + 扫掠角在 ArcSegment 中获取终点

Python 在解析表时处理 NoneType

javascript - 无法使用javascript解析json

.NET:通过反射获取资源

.net - CLR 和 CLI - 有什么区别?

java - 正则表达式不会将空格字符与 [\r\n\t\f\s] 匹配

python - 替换数据框中格式不正确的值

c++ - 在数字的第一个符号处拆分字符串的快速方法

c# - 如何连接 2 个列表