2009-08-10 12 views
2

単純な式を評価するためにC#式ツリーを構築しています。式の文字列はツリーに解析され、基本演算子(数学的、論理的および関係的)と同様に、括弧を使用して優先順位を尊重します。C#式ツリー - 動的値の参照

bool、string、およびinteger型に加えて、実行時に式の要素のいくつかを評価する必要があります。これらは、例えば、テンプレート文字列で表される。

([firstname] == "bob") && ([surname] == "builder") 

上記式はループで、例えば、現在の式呼び出しのコンテキストを提供するオブジェクトの(潜在的に大きな)数について評価されるであろう。テンプレート化されたセクションは現在のコンテキストに反映されます(例:この例では現在のユーザーのファーストネームと姓が解決され、テンプレート化された文字列ではなく式の解像度で使用されます。

解決方法の1つは、構文解析時にテンプレート化された値を解決することです。つまり、定数式の型を使用でき、値の型がわかるようになります。しかし、それぞれの使い方を表現するツリーを再構築して再コンパイルすると、パフォーマンスが悪くなります。呼び出し時にメソッド呼び出しによって

E.g. Desired example of usage in pseudo code 
ExpressionParser parser = new ExpressionParser(); // parses and builds expression trees 
MyParsedExpression expression = parser.Parse("([firstname] == 'bob') && ([surname] == 'builder'"); // wrapper for the parsed expression 
foreach (Object user in users) 
{ 
    expression.Context = user; 
    Boolean result = expression.EvaluateTruth(); 
    if (result == true) 
    { 
     // do something 
    } 
} 

おかげで、 fturtle

を解決した - - 値の型が解析時に知られていない、と :

だから、私は式の型を必要とします

答えて

2

入力パラメータを表すには​​を使用します。型の例外としては...式ツリーを構築するときにデータの型を知っていますか?そうでない場合、それは事をもっと難しくします...

あなたに何か役に立った場合、私はsimilar questionに最近いくつかのソースコードで回答しました。 すぐにが使えないかもしれませんが、それは良いスタートになるはずです。

編集:表現木があなたにとってここで非常に役に立つとは思っていません。特にPropertyExpressionには該当するPropertyInfoが含まれているため、それが動作しているタイプを知る必要があります。タイプがすべての値に対して変更できる場合は、すべての値に対して式ツリーを再構築する必要があります。

+0

応答のための歓声。私は式がネストすることができ、任意の数のテンプレート化された値を含むことができるので、パラメータ式がここで助けになるかどうかはわかりません。さらに、式ツリーの構築時には型がわかりません。要約すると、私はある種の委任表現の後にいると思います。 – fturtle

+0

私はあなたが何をしようとしているのか、何時に何の情報が知られているのかは本当にはっきりしていません。あなたはすでに物事の解析面を持っていますか?あなたが持っている情報は何ですか?あなたは何を持っていますか?あとで強く型付けされた式ツリーを構築できる中間形式を保存できますか? –