動的評価のために文字列を LINQ 式ツリーに変換する
バックグラウンド
特定のシナリオでは、文字列として定義された論理式をオブジェクト インスタンスに対して評価する必要があります。たとえば、名前、年齢、体重などのプロパティを持つ人を表すクラスがあり、「年齢 > 3 AND 体重 > 50」のような文字列式を評価したいとします。
オーバーエンジニアリングされたソリューション提案
最初のアイデアは、ANTLR を使用して文字列式から AST を作成することでした。その後、AST が走査されて、Func
代替ソリューション: ダイナミック LINQ ライブラリ
カスタム パーサーを開発する代わりに、ダイナミック LINQ ライブラリを利用できます。具体的には、その Dynamic Query クラスです。このクラスは、文字列式を解析し、対応するラムダ式を生成する便利な方法を提供します。
実装
次に、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); } } }
この例では、Dynamic を使用して式文字列をラムダ式に解析します。リンク。次に、ラムダ式をコンパイルし、それを Person インスタンスで呼び出して式を評価し、ブール値の結果を取得します。
結論
ダイナミック LINQ ライブラリは、より簡単な関数を提供します。オブジェクトに対して文字列式を動的に評価するソリューション。これにより、カスタム パーサーを開発する必要がなくなり、文字列式からラムダ式を構築するための便利なメカニズムが提供されます。
以上がC# でオブジェクトに対して文字列式を動的に評価するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。