Non è complicato, sono poche righe di codice, devi aver chiari i concetti di OOP.
Considera questa interfaccia:
public interface IMyFunction
{
double Eval(double x);
}
Una classe che implementa questa interfaccia può fornire i valori di una specifica funzione, ad esempio:.
public class MyFunction_1: IMyFunction
{
public double Eval(double x)
{
return Math.Cos(x) * Math.Sin(x);
}
}
Ora l' idea è che quando tu hai ottenuto la stringa che descrive la funzione, scrivi proprio questo testo, lo compili, istanzi la classe, e ne richiami il metodo 'Eval' per ogni punto che devi disegnare.
In tutto sono dieci righe di codice:
private IMyFunction CreateFunction(string text)
{
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add(GetType().Module.Name);
string s = "using System;" +
"class MyFunction:" + GetType().Namespace + ".IMyFunction" +
"{ public double Eval(double x) { return " + text + "; }}";
CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(cp, s);
if (result.Errors.Count != 0)
return null;
Type type = result.CompiledAssembly.GetType("MyFunction");
return (IMyFunction) Activator.CreateInstance(type);
}
A questo punto basta chiamarla in questo modo:
IMyFunction f = CreateFunction("Math.Cos(x * x)");
...
double y = f.Eval(10);
Ovviamente gli passerai il testo scritto nel TextBox (ricordati di dichiarare IMyFunction).