Menilai Ungkapan LINQ Secara Dinamik daripada Rentetan
Masalah:
Diberi rentetan input yang mewakili a Ungkapan LINQ, seperti "(Person.Umur > 3 AND Person.Weight > 50) ATAU Person.Umur <3", matlamatnya adalah untuk mencipta Func
Pendekatan Terlalu Banyak:
Penyelesaian yang dicadangkan yang melibatkan tatabahasa ANTLR dan rangka kerja Pembina Predikat mungkin tidak perlu rumit.
Penyelesaian Alternatif: Dinamik LINQ
Perpustakaan LINQ Dinamik menyediakan penyelesaian yang elegan dan mudah. Begini cara untuk menggunakannya:
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 FavouriteDay { get; set; } } static void Main() { // Input expression string const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3"; // Compile expression into a lambda expression var p = Expression.Parameter(typeof(Person), "Person"); var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp); // Create a Person instance var bob = new Person { Name = "Bob", Age = 30, Weight = 213, FavouriteDay = new DateTime(2000, 1, 1) }; // Evaluate expression against the Person instance var result = e.Compile().DynamicInvoke(bob); // Print result Console.WriteLine(result); Console.ReadKey(); } } }
Dalam contoh ini, kami menghuraikan rentetan ungkapan secara dinamik ke dalam ungkapan lambda dan kemudian menyusunnya menjadi Func Faedah LINQ Dinamik: Nota: Ingat untuk memasukkan pakej System.Linq.Dynamic nuget untuk kod ini berfungsi. Atas ialah kandungan terperinci Bagaimanakah saya boleh menilai secara dinamik ungkapan LINQ daripada rentetan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!