C Sharp Metaprogramming

using System; using System.Reflection; using System.CodeDom.Compiler; using Microsoft.CSharp;

class MetaProgram {

delegate float ScalarFunction(float t);

static void Main(string[] args) {

// create method that evaluates expression given by args[0] ScalarFunction f = createMethod(args[0]);

// evaluate a sequence of values for(float t = 0f; t <= 1f; t += 0.1f) { Console.WriteLine( f(t) ); }   }

static ScalarFunction createMethod(string expression) { CSharpCodeProvider codeProvider = new CSharpCodeProvider;

CompilerParameters cp = new CompilerParameters; cp.GenerateExecutable = false; cp.GenerateInMemory = true;

string ModuleSource = "class RuntimeGeneratedClass { " + "public static float Evaluate(float t) { return (float)(" +	   expression + ");}} ";

CompilerResults cr = codeProvider.CompileAssemblyFromSource(cp, ModuleSource);

if (cr.Errors.Count > 0) { throw new ArgumentException(		   string.Format("Expression cannot be evaluated: {0}", cr.Errors[0].ErrorText)); }	else { MethodInfo methodinfo = cr.CompiledAssembly.GetType("RuntimeGeneratedClass").GetMethod("Evaluate");

return Delegate.CreateDelegate(typeof(ScalarFunction), methodinfo) as ScalarFunction; }   } }