Nic prostszego - musisz tylko skompilować kod w locie, a potem przy użyciu refleksji go wywołać.
Np. tak:
private void button1_Click(object sender, EventArgs e)
{
double result = Calculate(this.textBox1.Text);
MessageBox.Show(result.ToString());
}
static double Calculate(string expression)
{
string pattern = @"
using System;
namespace MathNamespace
{{
public class MathClass
{{
public static double Calculate()
{{
return {0};
}}
}}
}}";
string source = string.Format(pattern, expression);
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters()
{
GenerateExecutable = false,
GenerateInMemory = true,
};
parameters.ReferencedAssemblies.Add("System.dll");
CompilerResults compilerResult = provider.CompileAssemblyFromSource(parameters, source);
Assembly assembly = compilerResult.CompiledAssembly;
Type type = assembly.GetType("MathNamespace.MathClass");
MethodInfo method = type.GetMethod("Calculate");
return (double)method.Invoke(null, null);
}