首頁 >後端開發 >C++ >如何根據 C# 中的物件動態計算字串表達式?

如何根據 C# 中的物件動態計算字串表達式?

DDD
DDD原創
2025-01-06 18:01:45173瀏覽

How Can I Dynamically Evaluate String Expressions Against Objects in C#?

將字串轉換為LINQ 表達式樹以進行動態計算

背景

背景

在某些情況下,有必要針對物件實例評估定義為字串的邏輯表達式。例如,我們可能有一個代表具有姓名、年齡和體重等屬性的人的類,並且我們想要計算“年齡 > 3 AND 體重 > 50”之類的字串表達式。

過度設計的解決方案提案

最初的想法是使用 ANTLR 從字串表達式建立 AST。隨後將遍歷 AST 以動態建構 Func 。使用謂詞生成器框架進行謂詞。雖然這種方法提供了靈活性,但它似乎過於複雜。

替代解決方案:動態 LINQ 函式庫

我們可以利用動態 LINQ 函式庫,而不是開發自訂解析器,特別是它的動態查詢類別。此類別提供了一種解析字串表達式並產生對應的 lambda 表達式的便捷方法。

using System;
using System.Linq.Expressions;
using System.Linq.Dynamic;

namespace ExpressionParser
{
  class Program
  {
    public class Person
    {
      public string Name { get; set; }
      public int Age { get; set; }
      public int Weight { get; set; }
      public DateTime FavoriteDay { get; set; }
    }

    static void Main()
    {
      const string filter = "(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";
      var personParameter = Expression.Parameter(typeof(Person), "Person");
      var lambdaExpression = DynamicExpression.ParseLambda(new[] { personParameter }, null, filter);
      var person = new Person
      {
        Name = "Bob",
        Age = 30,
        Weight = 213,
        FavoriteDay = new DateTime(2000, 1, 1)
      };

      bool match = lambdaExpression.Compile().DynamicInvoke(person);
      Console.WriteLine(match);
    }
  }
}
實作

以下是示範動態LINQ 用法的程式碼範例:

在此範例中,我們使用Dynamic LINQ 將表達式字串解析為lambda 表達式。然後我們編譯 lambda 表達式並在 Person 實例上呼叫它來計算表達式並獲得布林結果。

結論動態 LINQ 函式庫提供了更簡單的針對物件動態評估字串表達式的解。它消除了開發自訂解析器的需要,並提供了一種從字串表達式建構 lambda 表達式的便捷機制。

以上是如何根據 C# 中的物件動態計算字串表達式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn