1. 程式人生 > 實用技巧 >利用js的eval()構造C#的Evaluator

利用js的eval()構造C#的Evaluator

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
using System.Reflection;

namespace HS.Comm.Utility
{
    /// <summary>
    /// JS動態語法解析
    /// </summary>
    public class Evaluator
    {
        /// <summary>
        /// 靜態建構函式
        
/// </summary> static Evaluator() { //構造JScript的編譯驅動程式碼 CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript"); CompilerParameters parameters; parameters = new CompilerParameters(); parameters.GenerateInMemory
= true; CompilerResults results; results = provider.CompileAssemblyFromSource(parameters, _jscriptSource); Assembly assembly = results.CompiledAssembly; _evaluatorType = assembly.GetType("Evaluator"); _evaluator = Activator.CreateInstance(_evaluatorType); }
/// <summary> /// 計算結果,如果表示式出錯則丟擲異常 /// </summary> /// <param name="statement">表示式,如"1+2+3+4"</param> /// <returns>結果</returns> public static object Eval(string statement) { try { object obj = _evaluatorType.InvokeMember("Eval", BindingFlags.InvokeMethod, null, _evaluator, new object[] { statement }); return obj; } catch { return string.Empty; } } private static object _evaluator = null; private static Type _evaluatorType = null; /// <summary> /// JScript程式碼 /// </summary> private static readonly string _jscriptSource = @"class Evaluator { public function Eval(expr : String) : String { return eval(expr); } }"; } }