【问题标题】:Convert complex bool condition from string to bool in .NET在.NET中将复杂的布尔条件从字符串转换为布尔
【发布时间】:2010-10-15 22:58:15
【问题描述】:

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

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

例如:

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

知道如何实现吗?

【问题讨论】:

    标签: .net string parsing boolean


    【解决方案1】:

    这是一个巧妙的求值器类,它在 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)。从现有项目中提取,因此您可能需要调整!

    【讨论】:

    • 太棒了! PS EvaluateToBool 应该有 bool 返回
    • BTW 性能怎么样?您认为这可能是一个问题吗?
    • "Maciej(第一条评论)- 男生复制、粘贴和无法正确编辑错误。将编辑。谢谢。
    【解决方案2】:

    您描述的字符串是有效的 C# 代码,因此如果您可以在运行时解释它,您就完成了。在许多语言中,这是一个内置函数。在 C# 中不是,但您可以使用第 3 方库,例如 runtime C# interpreter

    【讨论】:

    • 您提到的运行时 C# 表达式评估器看起来很有趣,但下载链接似乎已损坏-您有源代码吗?
    【解决方案3】:

    标准方法是:

    • 标记字符串
    • 构建一棵树,在每个节点中放置一个运算符,在每个叶子中放置一个操作数
    • 访问评估表达式的树

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 1970-01-01
      • 2011-01-13
      • 2018-09-07
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2021-05-27
      相关资源
      最近更新 更多