Heim >Backend-Entwicklung >C++ >Wie kann ich String-Ausdrücke anhand von Objekten in C# dynamisch auswerten?

Wie kann ich String-Ausdrücke anhand von Objekten in C# dynamisch auswerten?

DDD
DDDOriginal
2025-01-06 18:01:45173Durchsuche

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

Konvertieren eines Strings in einen LINQ-Ausdrucksbaum für die dynamische Auswertung

Hintergrund

In bestimmten Szenarien Es wird notwendig, einen als Zeichenfolge definierten logischen Ausdruck anhand einer Objektinstanz auszuwerten. Beispielsweise können wir eine Klasse haben, die eine Person mit Eigenschaften wie Name, Alter und Gewicht darstellt, und wir möchten einen Zeichenfolgenausdruck wie „Alter > 3 UND Gewicht > 50“ auswerten.

Überentwickelter Lösungsvorschlag

Die ursprüngliche Idee bestand darin, ANTLR zu verwenden, um aus dem Zeichenfolgenausdruck einen AST zu erstellen. Der AST würde anschließend durchlaufen, um dynamisch eine Func zu erstellen. Prädikat mithilfe des Predicate Builder-Frameworks. Obwohl dieser Ansatz Flexibilität bietet, scheint er übermäßig komplex zu sein.

Alternative Lösung: Dynamic LINQ Library

Anstatt einen benutzerdefinierten Parser zu entwickeln, können wir die Dynamic LINQ-Bibliothek nutzen, insbesondere seine Dynamic Query-Klasse. Diese Klasse bietet eine praktische Möglichkeit, einen String-Ausdruck zu analysieren und einen entsprechenden Lambda-Ausdruck zu generieren.

Implementierung

Hier ist ein Codebeispiel, das die Verwendung von Dynamic LINQ demonstriert:

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

In diesem Beispiel analysieren wir die Ausdruckszeichenfolge mithilfe von Dynamic LINQ in einen Lambda-Ausdruck. Anschließend kompilieren wir den Lambda-Ausdruck und rufen ihn in einer Person-Instanz auf, um den Ausdruck auszuwerten und ein boolesches Ergebnis zu erhalten.

Fazit

Die Dynamic LINQ-Bibliothek bietet eine einfachere Lösung Lösung zur dynamischen Auswertung von Zeichenfolgenausdrücken anhand von Objekten. Es macht die Entwicklung eines benutzerdefinierten Parsers überflüssig und bietet einen praktischen Mechanismus zum Erstellen von Lambda-Ausdrücken aus Zeichenfolgenausdrücken.

Das obige ist der detaillierte Inhalt vonWie kann ich String-Ausdrücke anhand von Objekten in C# dynamisch auswerten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn