Вычисление выражения с использованием 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;
        }        
    }
}

Любые идеи, почему метод eval2 не работает корректно, когда я даю выражение, как х + у? Eval работает нормально, но мне нужно 2 из них, чтобы решить различные уравнения, введенные в текстовое поле.

1 ответ

Решение

Вы не можете использовать выражение, содержащее две разные переменные (например, "x" и "y") в eval(double x) а также eval(double x, double y) Метод: первый не компилируется (поскольку вторая переменная там не определена), тогда как использование выражений, содержащих только одну переменную (например, "x"), компилируется в обоих случаях. Это объясняет, почему вы не можете вызвать eval2() в случае двух переменных.

Другие вопросы по тегам