5

条件式を文字列に解析する方法を探しています。

私が考えることができる最良の例は、LINQ-to-SQLです。ExpressionVisitorsを使用して「Where」句をフォーマットします。例:

from a in b where a.x == 5 && a.y < 3 select a

これは、次の文字列に変換されます(おおよそ、MSSQLは私にとって最新ではありません)。

"SELECT * FROM b WHERE x = 5 AND y < 3"

私が読んだことから、これはこの記事で説明されているように、ExpressionVisitorクラスを使用して行われました:リンク

問題は、LINQを使用していないことですが、この特定の機能が必要です。そのような条件を解析する方法はありますか?リフレクション、デリゲート、ラムダなどで何でもするつもりです。

正直なところ、それは不可能だと思いますが、私の脳は少し揚げられているので(読んでください:質問がばかげているならいいです)、私はS/Oを試してみたほうがいいと思いました。

編集:最終的な使用例:

// Usage:
foo.Bar(foo => foo.X == 5 && foo.Y < 3)

// Ideal string output (variable name (foo) is not needed):
"foo.X == 5 && foo.Y < 3"

編集2:はい、数は3より小さく、5に等しくすることができます。私の脳は揚げられているとあなたに言いました。

4

2 に答える 2

4

式ツリー自体を構築する場合は、C#コンパイラの機能を活用できます。

Funcの型引数がわかっている限り、ラムダ式を関数受け入れ式>に渡すことは合法です。例えば

 private static void PrintExpression(Expression<Func<int, bool>> lambda)
 {
      Console.WriteLine(lambda.ToString());
 }

と呼ぶことができます

 PrintExpression(a=> a > 0 && a < 5);

あなたはジェネリックで即興することができます

private static void PrintExpression<T1,T2>(Expression<Func<T1, T2>> lambda)
{
      Console.WriteLine(lambda.ToString());
}

そしてそれを

   PrintExpression<int, bool>(a=> a > 0 && a < 5);

式の部分をカスタム印刷する場合は、式やその他の適切なロジックを印刷する単純な再帰関数を記述できます。

ラムダ式はコンパイル時に式にコンパイルされるため、コンパイル済みのFuncで置き換えることはできません。

これに代わる方法として、いつでもカスタムクエリプロバイダーを構築できますが、それは目的から少し外れます-ある種のクエリ可能(再びカスタム)にバインドする必要があるためです。

于 2010-11-17T03:50:27.887 に答える
3

次のようなものを試してください。

static string GetExpressionString<T>(Expression<Func<T, bool>> expression)
{
    return expression.Body.ToString();
}

そのように使用法:

string s = GetExpressionString<Foo>(foo => foo.X == 5 && foo.Y < 3);

どちらが返されますか:

((foo.X = 5) && (foo.Y < 3))
于 2010-11-17T04:11:47.053 に答える