將字串轉換為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中文網其他相關文章!