ฟังก์ชั่นเทียบเคียง eval ใน Javascript ด้วย CSharp เขียนเมื่อ 2010.07.10 โดย

ในหลายๆครั้งการทำงานในรูปแบบ interpreted ของภาษาต่างๆ ก็มีความยืดหยุ่นมากกว่ารูปแบบ compiled อยู่เหมือนกัน ดังเช่นวันก่อนจำเป็นต้องคำนวณผลลัพธ์จาก string ซึ่งถ้าเป็นใน Javascript, PHP หรือ interpret อื่นๆ จะมีฟังก์ชั่น eval เพื่อการแก้ปัญหานี้ เป็นเรื่องน่าเสียดายที่ .Net ไม่มีความสามารถนี้ให้มาด้วย อาจจะเพราะการจัดการหน่วยความจำต่างๆ ซึ่งเป็นจุดด้อยของแบบ compiled อยู่แล้ว ดังนั้นเพื่อแก้ปัญหาจึงทำการแก้ปัญหาด้วยการเขียน Class Eval นี้ขึ้นมา โดยเลือกที่จะใช้การสร้าง Assembly ขึ้นมาเนื่องจากน่าจะง่ายกว่าการ Parse แล้วคำนวณซึ่งวิธีหลังนี้ต้องมีการคิดเรื่อง lexical เพิ่มขึ้นด้วย เรามาดู Class Eval ของเรากัน

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