Heim >Backend-Entwicklung >C++ >Wie kann ich String-Ausdrücke anhand von Objekten in C# dynamisch auswerten?
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
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!