Вычисление выражения с использованием 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()
в случае двух переменных.