using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
namespace Modoeye
{
public class Eval
{
public static double eval(string expressions)
{
var cscp = new CSharpCodeProvider();
var cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
cp.OutputAssembly = "EvalModule";
var sc = "namespace ns{ using System; class myeval{ public static double Evaluate(){return " + expressions + ";}}} ";
CompilerResults cr = cscp.CompileAssemblyFromSource(cp, sc);
if (cr.Errors.Count > 0)
{
throw new ArgumentException("Expression cannot be evaluated, please use a valid C# expression");
}
else
{
var mi = cr.CompiledAssembly.GetType("ns.myeval").GetMethod("Evaluate");
return (double)mi.Invoke(null, null);
}
}
}
}
เราสร้าง Class Eval ขึ้นมาโดยมี static method เพียงอันเดียวคือ eval โดยเป็นการเรียกใช้งาน CSharpCodeProvider และ CompilerParameter เพื่อใช้ในการ compile โค๊ดของเรา หลังจากทำการ compile แล้วเราก็สั่ง execute เพื่อรับผลรับกลับมาเท่านั้น ตอนนี้เขียนเพื่อคำนวณเท่านั้น ยังห่างไกลจาก eval ของ interpret language มากนักแต่ก็แก้ปัญหาตามที่้ต้องการได้ครับ