ホームページ > バックエンド開発 > C++ > C# でオブジェクトに対して文字列式を動的に評価するにはどうすればよいですか?

C# でオブジェクトに対して文字列式を動的に評価するにはどうすればよいですか?

DDD
リリース: 2025-01-06 18:01:45
オリジナル
179 人が閲覧しました

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

動的評価のために文字列を LINQ 式ツリーに変換する

バックグラウンド

特定のシナリオでは、文字列として定義された論理式をオブジェクト インスタンスに対して評価する必要があります。たとえば、名前、年齢、体重などのプロパティを持つ人を表すクラスがあり、「年齢 > 3 AND 体重 > 50」のような文字列式を評価したいとします。

オーバーエンジニアリングされたソリューション提案

最初のアイデアは、ANTLR を使用して文字列式から AST を作成することでした。その後、AST が走査されて、Func が動的に構築されます。 Predicate Builder フレームワークを使用して述語を作成します。このアプローチは柔軟性を提供しますが、複雑すぎるように見えます。

代替ソリューション: ダイナミック 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート