Maison >développement back-end >C++ >Comment puis-je évaluer dynamiquement des expressions de chaîne par rapport à des objets en C# ?

Comment puis-je évaluer dynamiquement des expressions de chaîne par rapport à des objets en C# ?

DDD
DDDoriginal
2025-01-06 18:01:45173parcourir

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

Conversion d'une chaîne en arbre d'expression LINQ pour une évaluation dynamique

Arrière-plan

Dans certains scénarios, il devient nécessaire d'évaluer une expression logique définie comme une chaîne par rapport à une instance d'objet. Par exemple, nous pouvons avoir une classe représentant une personne avec des propriétés telles que le nom, l'âge et le poids, et nous souhaitons évaluer une expression de chaîne telle que « Âge > 3 ET Poids > 50 ».

Proposition de solution sur-conçue

L'idée initiale était d'utiliser ANTLR pour créer un AST à partir de l'expression de chaîne. L'AST serait ensuite parcouru pour construire dynamiquement un Func prédicat à l’aide du framework Predicate Builder. Bien que cette approche offre de la flexibilité, elle semble trop complexe.

Solution alternative : bibliothèque Dynamic LINQ

Au lieu de développer un analyseur personnalisé, nous pouvons exploiter la bibliothèque Dynamic LINQ, en particulier sa classe Dynamic Query. Cette classe offre un moyen pratique d'analyser une expression de chaîne et de générer une expression lambda correspondante.

Implémentation

Voici un exemple de code illustrant l'utilisation de Dynamic LINQ :

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);
    }
  }
}

Dans cet exemple, nous analysons la chaîne d'expression en une expression lambda à l'aide de Dynamic LINQ. Nous compilons ensuite l'expression lambda et l'invoquons sur une instance Person pour évaluer l'expression et obtenir un résultat booléen.

Conclusion

La bibliothèque Dynamic LINQ fournit une méthode plus simple solution pour évaluer dynamiquement les expressions de chaîne par rapport aux objets. Il élimine le besoin de développer un analyseur personnalisé et fournit un mécanisme pratique pour construire des expressions lambda à partir d'expressions de chaîne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn