Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menilai Ungkapan Rentetan Secara Dinamik Terhadap Objek dalam C#?

Bagaimanakah Saya Boleh Menilai Ungkapan Rentetan Secara Dinamik Terhadap Objek dalam C#?

DDD
Lepaskan: 2025-01-06 18:01:45
asal
180 orang telah melayarinya

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

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 predikat menggunakan rangka kerja Pembina Predikat. Walaupun pendekatan ini memberikan fleksibiliti, ia kelihatan terlalu rumit.

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);
    }
  }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan