DynamicExpresso表達式求值

DynamicExpresso 2.3.1 最低要求.net 4.6.1

github地址:https://github.com/davideicardi/DynamicExpresso

常用方法

/// <summary>
/// 忽略大小寫判斷相等
/// </summary>
/// <param name="str1"></param>
/// <param name="str2"></param>
/// <returns></returns>
public static bool EqualsIgnorecase(object str1, object str2)
{
    if (str1 == null && str2 == null)
        return true;

    if (str1 == null || str2 == null)
    {
        return false;
    }

    return string.Equals(str1.ToString(), str2.ToString(), StringComparison.OrdinalIgnoreCase);
}

/// <summary>
/// str1 以 str2開頭
/// </summary>
/// <param name="str1"></param>
/// <param name="str2"></param>
/// <returns></returns>
public static bool StartsWithIgnorecase(object str1, object str2)
{
    if (str1 == null && str2 == null)
        return true;

    if (str1 == null || str2 == null)
    {
        return false;
    }

    return str1.ToString().StartsWith(str2.ToString(), StringComparison.OrdinalIgnoreCase);
}

/// <summary>
/// str1 以 str2 結尾
/// </summary>
/// <param name="str1"></param>
/// <param name="str2"></param>
/// <returns></returns>
public static bool EndsWithIgnorecase(object str1, object str2)
{
    if (str1 == null && str2 == null)
        return true;

    if (str1 == null || str2 == null)
    {
        return false;
    }

    return str1.ToString().EndsWith(str2.ToString(), StringComparison.OrdinalIgnoreCase);
}

/// <summary>
/// 忽略大小寫 比較
/// </summary>
/// <param name="str1"></param>
/// <param name="str2"></param>
/// <returns></returns>
public static int CompareIgnorecase(object str1, object str2)
{
    if (str1 == null && str2 == null)
        return 0;

    if (str1 == null || str2 == null)
    {
        return 0;
    }

    return string.Compare(str1.ToString(), str2.ToString(), StringComparison.OrdinalIgnoreCase);
}

/// <summary>
/// 索引位置
/// </summary>
/// <param name="str1"></param>
/// <param name="str2"></param>
/// <returns></returns>
public static int IndexOfIgnorecase(object str1, object str2)
{
    if (str1 == null && str2 == null)
        return -1;

    if (str1 == null || str2 == null)
    {
        return -1;
    }

    return str1.ToString().IndexOf(str2.ToString(), StringComparison.OrdinalIgnoreCase);
}

/// <summary>
/// 匹配最後一個索引位置
/// </summary>
/// <param name="str1"></param>
/// <param name="str2"></param>
/// <returns></returns>
public static int LastIndexOfIgnorecase(object str1, object str2)
{
    if (str1 == null && str2 == null)
        return -1;

    if (str1 == null || str2 == null)
    {
        return -1;
    }

    return str1.ToString().LastIndexOf(str2.ToString(), StringComparison.OrdinalIgnoreCase);
}

擴展string

/// <summary>
/// 解析表達式
/// </summary>
/// <param name="str">字符串</param>
/// <param name="paramName">參數名</param>
/// <param name="obj">參數</param>
/// <returns></returns>
public static T Eval<T>(this string str, string paramName = "obj", object obj = null)
{
    Interpreter expr = new Interpreter(InterpreterOptions.Default)
        .SetFunction("equalsIgnore", (Func<object, object, bool>)EqualsIgnorecase)
        .SetFunction("startsIgnore", (Func<object, object, bool>)StartsWithIgnorecase)
        .SetFunction("endsIgnore", (Func<object, object, bool>)EndsWithIgnorecase)
        .SetFunction("compareIgnore", (Func<object, object, int>)CompareIgnorecase)
        .SetFunction("indexOfIgnore", (Func<object, object, int>)IndexOfIgnorecase)
        .SetFunction("lastIndexOfIgnore", (Func<object, object, int>)LastIndexOfIgnorecase);
    if (obj != null)
    {
        paramName = paramName ?? "obj";
        expr.SetVariable(paramName, obj);
    }
    return expr.Eval<T>(str);
}

測試:

using DynamicExpresso;
using System;
using System.Collections.Generic;
using System.Dynamic;

namespace Test
{
    class Program
    {
        static void Main()
        {
            int result = "3+2".Eval<int>();
            Console.WriteLine(result);

            dynamic obj = new ExpandoObject();
            obj.Name = ".net";
            obj.Id = 10;

            IDictionary<string, object> dic = obj as IDictionary<string, object>;
            dic.Add("Address", "北京市東城區");
            /*
            var interpreter = new Interpreter()
                .SetVariable("obj", (object)obj);
            Console.WriteLine(obj.Id == interpreter.Eval<int>("obj.Id"));
            */

            //True
            bool flag = "((int)obj.Id) > 2 && equalsIgnore(obj.Name,\".Net\") && startsIgnore(obj.Name,\".\")"
                .Eval<bool>("obj", (object)obj);
            Console.WriteLine(flag);

            //True
            flag = "obj.Address.Contains(\"北京\")".Eval<bool>("obj", (object)obj);
            Console.WriteLine(flag);
            Console.ReadLine();
        }
    }
}

結果(4.7.1,4.6.1一樣)

發佈了23 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章