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 มากนักแต่ก็แก้ปัญหาตามที่้ต้องการได้ครับ
คำเตือน เนื้อหาต่างๆ ในบทความ รวมถึงรูปภาพทั้งหมดในบทความนี้ เป็นความเห็นส่วนตัวของผู้เขียนแต่ละคน ซึ่งแต่ละคนได้ทำการลงทะเบียน และเขียนบทความลงใน Modoeye Articles นี้โดยไม่มีค่าธรรมเนียมใดๆ บทความเหล่านี้เป้าหมายเพื่อการศึกษา และความบันเทิงเท่านั้น การนำส่วนหนึ่งส่วนใดของบทความไปใช้งาน ควรทำการอ้างอิงถึงผู้เขียนและแหล่งที่มาด้วย