Menukar String kepada LINQ Expression Tree untuk Penilaian Dinamik
Latar Belakang
Dalam senario tertentu, ia menjadi perlu untuk menilai ungkapan logik yang ditakrifkan sebagai rentetan terhadap contoh objek. Sebagai contoh, kami mungkin mempunyai kelas yang mewakili seseorang dengan sifat seperti nama, umur dan berat, dan kami ingin menilai ungkapan rentetan seperti "Umur > 3 DAN Berat > 50".
Cadangan Penyelesaian Terlalu Banyak
Idea awal ialah menggunakan ANTLR untuk mencipta AST daripada ungkapan rentetan. AST kemudiannya akan dilalui untuk membina secara dinamik Func
Penyelesaian Alternatif: Perpustakaan LINQ Dinamik
Daripada membangunkan penghurai tersuai, kami boleh memanfaatkan perpustakaan LINQ Dinamik, khususnya kelas Pertanyaan Dinamiknya. Kelas ini menawarkan cara yang mudah untuk menghuraikan ungkapan rentetan dan menjana ungkapan lambda yang sepadan.
Pelaksanaan
Berikut ialah contoh kod yang menunjukkan penggunaan LINQ Dinamik:
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); } } }
Dalam contoh ini, kami menghuraikan rentetan ungkapan menjadi ungkapan lambda menggunakan Dynamic LINQ. Kami kemudiannya menyusun ungkapan lambda dan memanggilnya pada contoh Orang untuk menilai ungkapan dan mendapatkan hasil boolean.
Kesimpulan
Pustaka LINQ Dinamik menyediakan yang lebih mudah penyelesaian untuk menilai secara dinamik ungkapan rentetan terhadap objek. Ia menghapuskan keperluan untuk membangunkan penghurai tersuai dan menyediakan mekanisme yang mudah untuk membina ungkapan lambda daripada ungkapan rentetan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menilai Ungkapan Rentetan Secara Dinamik Terhadap Objek dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!