選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
4 分鐘閱讀時間 (822 個字)

在.net上動態執行expression part 2 套件篇

unsplash-coding130

繼前一篇介紹的 Part.1 微軟套件篇,本篇接著介紹如何動態執行以 C# 編寫的 Expression

1. Roslyn C# Scripting

微軟的官方套件之一

初次執行時需要花費一些時間編譯,因次有效能要求的需求,請建議不要使用

  • 優點

    • 提供 C# 程式碼執行
    • 僅需安裝 Microsoft 官方的套件
  • 缺點

    • 初次執行時需要花費時間編譯,第二次執行則不用花費時間
  • 評價:★★★★

使用說明請參考前一篇 的介紹

2. CodingSeb Expression Evaluator

  • Github

  • 功能:

    • 提供 Expression 執行

      • 單行程式碼
    • 提供 Script 執行

      • 多行程式碼,開放部分被限制使用的 C# Keyword
  • 優點

    • 沒有像 Roslyn C# Scripting 有初次執行時需要花費時間的問題
    • 功能與 Roslyn C# Scripting 差不多
  • 缺點

    • 少部分 C# Keyword 被限制使用,使用時請閱讀 官方文件 了解哪些 Keyword 被限制使用
  • 評價:★★★★★

 ■ 安裝

Install-Package CodingSeb.ExpressionEvaluator 

 ■ 使用

  • 建立 Expression Evaluator

using CodingSeb.ExpressionEvaluator;
using EvaluateExpressionSample.Scripts;
using System;
using System.Collections.Generic;

public static class ExpressionEvaluator 
{
    // 執行 Expression
    public static object Eval(string expression) 
    {
        var evaluator = new ExpressionEvaluator();
        
        // 設定 import 和 reference
        var namespaces = new List<string>()
        {
            "System",
            "System.Math",
            "System.Linq",
            "System.Text",
            "System.Text.RegularExpressions",
            "System.ComponentModel",
            "System.Collections",
            "System.Collections.Generic",
            "System.Collections.Specialized",
            "System.Globalization",
            "System.Security.Cryptography",
        };
        evaluator.Namespaces = namespaces;

        // 執行 Expression
        return evaluator.Evaluate(expression);
    }
    
    // 執行 Script
    public static object RunScript(string script) 
    {
        var evaluator = new ExpressionEvaluator();
        
        // 設定 import 和 reference
        var namespaces = new List<string>()
        {
            "System",
            "System.Math",
            "System.Linq",
            "System.Text",
            "System.Text.RegularExpressions",
            "System.ComponentModel",
            "System.Collections",
            "System.Collections.Generic",
            "System.Collections.Specialized",
            "System.Globalization",
            "System.Security.Cryptography",
        };
        evaluator.Namespaces = namespaces;

        // 執行 Script
        return evaluator.ScriptEvaluate(script);
    }    
} 
  • 使用

// result: "2021-04-06 10:00:00"
object dateResult = ExpressionEvaluator.Eval("DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\")");

// result: 178.53981633974485
object mathResult = ExpressionEvaluator.Eval("(5 * 5 * PI) + 100");

// result: "te"
object textResult = ExpressionEvaluator.Eval("\"testsplit\".Split('s')[0]"); 

3. Flee

 

  • Github LGPL License

  • 功能:

    • 提供 Expression 執行
  • 評價:★★★★

 ■ 安裝

Install-Package Flee 

 ■ 使用

  • 建立 Expression Evaluator

using Flee.PublicTypes;
using System;
using System.Collections;
using System.Text.RegularExpressions;

public static class ExpressionEvaluator 
{
    public static object Eval(string expression) 
    {
        var context = new ExpressionContext();
		
        // 設定 import 和 reference
        context.Imports.AddType(typeof(Math), "Math");
        context.Imports.AddType(typeof(DateTime), "DateTime");
        context.Imports.AddType(typeof(TimeSpan), "TimeSpan");
        context.Imports.AddType(typeof(Regex), "Regex");
        context.Imports.AddType(typeof(RegexOptions), "RegexOptions");
        context.Imports.AddType(typeof(IEnumerable), "List");

        // 執行 Expression
        var generic = context.CompileGeneric<object>(expression);
        return generic.Evaluate();
    }
} 
  • 使用

// result: "2021-04-06 10:00:00"
object dateResult = ExpressionEvaluator.Eval("DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\")");

// result: 178.53981633974485
object mathResult = ExpressionEvaluator.Eval("(5 * 5 * PI) + 100");

// result: "te"
object textResult = ExpressionEvaluator.Eval("\"testsplit\".Split('s')[0]"); 

4. Dynamic Expresso

  • Github

  • 功能:

    • 提供 Expression 執行
  • LiveDemo

  • 評價:★★★★

■ 安裝 

Install-Package DynamicExpresso.Core 

 ■ 使用

  • 建立 Expression Evaluator

using DynamicExpresso;
using System;

public static class ExpressionEvaluator 
{
    public static object Eval(string expression) 
    {
        var interpreter = new Interpreter();

        // 設定 import 和 reference
        interpreter.Reference(typeof(Math));
        interpreter.Reference(typeof(DateTime));
        interpreter.Reference(typeof(TimeSpan));
        interpreter.Reference(typeof(Regex));
        interpreter.Reference(typeof(RegexOptions));
        interpreter.Reference(typeof(IEnumerable));
        
        // 執行 Expression
        return interpreter.Eval(expression);
    }
} 
  • 使用

// result: "2021-04-06 10:00:00"
object dateResult = ExpressionEvaluator.Eval("DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\")");

// result: 178.53981633974485
object mathResult = ExpressionEvaluator.Eval("(5 * 5 * PI) + 100");

// result: "te"
object textResult = ExpressionEvaluator.Eval("\"testsplit\".Split('s')[0]"); 

上述工具的比較表

  Roslyn C# Scripting CodingSeb Expression Evaluator Flee Dynamic Expresso
License LGPL
Github Star N/A
Github Forks N/A
Support .NET Core ✔️ ✔️ ✔️ ✔️
Support new Keyword ✔️ ✔️    
Variables ✔️ ✔️ ✔️ ✔️
Import Namespace ✔️ ✔️ ✔️  
Reference Assembly ✔️ ✔️   ✔️
Pre-build Function   ✔️    
評價 ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ ⭐️

其他做法

除了上述的做法,還有其他的做法

由於我沒有深入研究,請自行研究

深入淺出 Ansible #1 - 什麼是 Ansible ?
每日小知識 #21 - Kubernetes-Cli

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/06, 週一

Captcha 圖像