c#解析类 Evaluator 实现动态流程

 

这个叫Evaluator的类,可以实现你的功能。
使用方法:Console.WriteLine("Test0: {0}", Evaluator.EvaluateToInteger("(30 + 4) * 2"));

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;

namespace ADOGuy
{
 /// <summary>
 /// Summary description for Class1.
 /// </summary>
 public class Evaluator
 {
    #region Construction
  public Evaluator(EvaluatorItem[] items)
  {
      ConstructEvaluator(items);
  }

    public Evaluator(Type returnType, string expression, string name)
    {
      EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
      ConstructEvaluator(items);
    }

    public Evaluator(EvaluatorItem item)
    {
      EvaluatorItem[] items = { item };
      ConstructEvaluator(items);
    }

    private void ConstructEvaluator(EvaluatorItem[] items)
    {
      ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
      CompilerParameters cp = new CompilerParameters();
      cp.ReferencedAssemblies.Add("system.dll");
      cp.ReferencedAssemblies.Add("system.data.dll");
      cp.ReferencedAssemblies.Add("system.xml.dll");
      cp.GenerateExecutable = false;
      cp.GenerateInMemory = true;

      StringBuilder code = new StringBuilder();
      code.Append("using System; /n");
      code.Append("using System.Data; /n");
      code.Append("using System.Data.SqlClient; /n");
      code.Append("using System.Data.OleDb; /n");
      code.Append("using System.Xml; /n");
      code.Append("namespace ADOGuy { /n");
      code.Append("  public class _Evaluator { /n");
      foreach(EvaluatorItem item in items)
      {
        code.AppendFormat("    public {0} {1}() ",
                          item.ReturnType.Name,
                          item.Name);
        code.Append("{ ");
        code.AppendFormat("      return ({0}); ", item.Expression);
        code.Append("}/n");
      }
      code.Append("} }");

      CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
      if (cr.Errors.HasErrors)
      {
        StringBuilder error = new StringBuilder();
        error.Append("Error Compiling Expression: ");
        foreach (CompilerError err in cr.Errors)
        {
          error.AppendFormat("{0}/n", err.ErrorText);
        }
        throw new Exception("Error Compiling Expression: " + error.ToString());
      }
      Assembly a = cr.CompiledAssembly;
      _Compiled = a.CreateInstance("ADOGuy._Evaluator");
    }
    #endregion

    #region Public Members
    public int EvaluateInt(string name)
    {
      return (int) Evaluate(name);
    }

    public string EvaluateString(string name)
    {
      return (string) Evaluate(name);
    }

    public bool EvaluateBool(string name)
    {
      return (bool) Evaluate(name);
    }

    public object Evaluate(string name)
    {
      MethodInfo mi = _Compiled.GetType().GetMethod(name);
      return mi.Invoke(_Compiled, null);
    }
    #endregion

    #region Static Members
    static public int EvaluateToInteger(string code)
    {
      Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);
      return (int) eval.Evaluate(staticMethodName);
    }

    static public string EvaluateToString(string code)
    {
      Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);
      return (string) eval.Evaluate(staticMethodName);
    }
   
    static public bool EvaluateToBool(string code)
    {
      Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);
      return (bool) eval.Evaluate(staticMethodName);
    }

    static public object EvaluateToObject(string code)
    {
      Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);
      return eval.Evaluate(staticMethodName);
    }
    #endregion

    #region Private
    const string staticMethodName = "__foo";
    Type _CompiledType = null;
    object _Compiled = null;
    #endregion
 }

  public class EvaluatorItem
  {
    public EvaluatorItem(Type returnType, string expression, string name)
    {
      ReturnType = returnType;
      Expression = expression;
      Name = name;
    }

    public Type ReturnType;
    public string Name;
    public string Expression;
  }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Expression Evaluator 是一个用 Java 编写的库,可以解析和计算数学表达式,并支持自定义函数和变量。它可以用于在 Java 应用程序中动态计算数学表达式,例如计算器或科学计算应用程序。使用 Java Expression Evaluator,您可以轻松地解析和计算包含各种数学函数和运算符的表达式,并在运行时添加自定义函数和变量。 Java Expression Evaluator 支持各种数学函数和运算符,例如加法、减法、乘法、除法、幂运算、三角函数、对数函数等。它还支持自定义函数和变量,您可以在运行时添加自己的函数和变量,并将它们包含在表达式中计算。 Java Expression Evaluator 的使用非常简单。您只需要创建一个 ExpressionEvaluator 对象,然后使用 evaluate() 方法计算表达式。例如: ``` ExpressionEvaluator ee = new ExpressionEvaluator(); double result = ee.evaluate("2 + 3 * 4"); ``` 以上代码将计算表达式 2 + 3 * 4,结果为 14。您也可以添加自定义函数和变量,例如: ``` ExpressionEvaluator ee = new ExpressionEvaluator(); ee.putFunction("square", new Function() { public double apply(double... args) { return args[0] * args[0]; } }); ee.putVariable("x", 5); double result = ee.evaluate("square(x) + 3"); ``` 以上代码将添加一个名为 square 的自定义函数,该函数计算参数的平方。然后,它将添加一个名为 x 的变量,并将其设置为 5。最后,它将计算表达式 square(x) + 3,结果为 28。 Java Expression Evaluator 是一个非常有用的库,可以帮助您轻松地解析和计算数学表达式,并支持自定义函数和变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值