使用CodeDom评估表达式

时间:2011-11-26 23:44:35

标签: c# math expression codedom

我正在尝试编写微分方程求解器,我需要允许用户通过文本框输入它们。问题是,当方程只包含x或类似x + y的东西时,求解方法会发生变化。如果在http://www.codeproject.com/KB/recipes/matheval.aspx上有很好的代码,但我无法将其扩展为2种方法

using System;
using System.Collections;
using System.Reflection;
namespace RKF45{
    public class MathExpressionParser
    {
        public object myobj = null;
        public ArrayList errorMessages;

        public MathExpressionParser()
        {
            errorMessages = new ArrayList();
        }
        public bool init(string expr)
        {
            Microsoft.CSharp.CSharpCodeProvider cp = new Microsoft.CSharp.CSharpCodeProvider();
            System.CodeDom.Compiler.CompilerParameters cpar = new System.CodeDom.Compiler.CompilerParameters();
            cpar.GenerateInMemory = true;
            cpar.GenerateExecutable = false;
            string src;
            cpar.ReferencedAssemblies.Add("system.dll");           
             src = "using System;" +
             "class myclass " +
             "{ " +
             "public myclass(){} " +

             "public static double eval(double x) " +
             "{ " +
             "return " + expr + "; " +
             "} " +

              "public static double eval2(double x,double y) " +
             "{ " +
             "return " + expr + "; " +
             "} " +

             "} ";
            System.CodeDom.Compiler.CompilerResults cr = cp.CompileAssemblyFromSource(cpar, src);
            foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                errorMessages.Add(ce.ErrorText);

           if (cr.Errors.Count == 0 && cr.CompiledAssembly != null)
        {
            Type ObjType = cr.CompiledAssembly.GetType("myclass");
            try
            {
                if (ObjType != null)
                {
                    myobj = Activator.CreateInstance(ObjType);
                }
            }
            catch (Exception ex)
            {
                errorMessages.Add(ex.Message);
            }
            return true;
        }
        else
            return false;
    }

        public double eval(double x)
        {
            double val = 0.0;
            Object[] myParams = new Object[1] { x };
            if (myobj != null)
            {
                System.Reflection.MethodInfo evalMethod = myobj.GetType().GetMethod("eval");
                val = (double)evalMethod.Invoke(myobj, myParams);
            }
            return val;
        }
        public double eval2(double x, double y)
        {
            double val = 0.0;
            Object[] myParams = new Object[2] { x, y };
            if (myobj != null)
            {
                System.Reflection.MethodInfo evalMethod = myobj.GetType().GetMethod("eval2");
                val = (double)evalMethod.Invoke(myobj, myParams);
            }
            return val;
        }        
    }
}

当我给出像x + y这样的表达式时,为什么eval2方法不能正常工作的任何想法? eval工作正常,但我需要其中2个来解决在文本框中输入的不同方程式。

1 个答案:

答案 0 :(得分:1)

你不能在eval(double x)eval(double x, double y)方法中使用包含两个不同变量(如“x”和“y”)的表达式:第一个不会编译(从第二个开始)变量没有在那里定义),而在这两种情况下使用仅包含单个变量(如“x”)的表达式。这解释了为什么在两个变量的情况下不能调用eval2()的原因。