1

実行ごとにASTを解釈するのではなく、式ツリーとして実行するようにスクリプトをサポートする既存のテンプレートソリューションを書き直しており、ロジックは既存のスクリプトで機能する必要があります。

私が今達成しようとしているのは、真をテストするためのソリューションを作成することです。

元。nullまたは空の文字列は、0および絶対値が0.0001未満の10進値と同様にfalseと見なされます。「true」と「false」は大文字と小文字を区別せず、文字列「null」はfalseです。

有効な入力タイプは、float、int、string、boolのみです。

コンパイルする式ツリーに組み込むことができるソリューションはすべて有効であり、オブジェクトをテストするための既存のメソッドがすでにありますが、外部メソッドを呼び出すための良い例を見つけることができません。

すべての例は、定数値で機能するか、引数を受け入れません。

アップデート

「Expression.ABC」メソッドを使用してツリーを構築していますが、式ツリーの結果のタイプ(string、int、float)を切り替える方法に資金を提供する際に問題が発生しています。

現在の構文はすべてを文字列として格納し、操作に応じてintとfloatに解析し、失敗した場合はデフォルト値を返します。

テンプレートに不正な構文が指定されている場合でも、フェイルセーフであり、常に結果の生成に成功するように構築されています。

アップデート

例(100%正確ではありませんが、現在のインタプリタを例示するため)

string Evaluate(Expr e) {
    switch(Expr.Type) {
        case "istrue":
            ExprValue value = Evaluate(Expr.Child);
            switch(value.Type) {
                case "String":
                    if(String.IsNullOrWhiteSpace(value.ToString()) || value.ToString().ToLower() == "false" || value.ToString().ToLower() == "null" || value.ToInt() == 0) return false;

                case "Int":
                    return value.ToInt() != 0;
                case "Float":
            }
    }
}

*更新*タイトルを変更

4

2 に答える 2

2

既存の式ツリーを呼び出す式ツリーは、静的メソッドを呼び出すシナリオとは大きく異なります。Expression.Call両方が可能です-それは(メソッドを呼び出す)とExpression.Invoke(式ツリーを呼び出す)の違いです。場合によっては、を介して2つのツリーをマージすることが望ましいことに注意してくださいExpressionVisitor

switchトリッキーです-ありますExpression.Switchが、c#コンパイラにはこれらの式のサポートが含まれていないため、Expressionメソッドを使用して完全に手動で作成する必要があります。

あなたがやろうとしていることの特定の(しかしおそらく機能しない)例を追加すると、私はあなたのシナリオのためにそれを具体化するために編集することができますが、現時点ではそれは非常に曖昧です。

于 2012-09-20T07:10:24.113 に答える
0

解決策は、デザインを変更することでした。

私の問題は、実行時に間違った時間にキャストを実行しようとしていたことですが、式ツリーはそれを適切に処理できません。

パーサーを完全に再設計して、強く型付けされたメソッドと変数、および明示的なキャストを使用しました。これにより、式ツリーへの変換がはるかに簡単になりました。

于 2012-12-05T12:52:07.233 に答える