7

メソッド全体を式ツリーに変換する機能を探しています。それを書き出すのは最悪だ。:)

したがって(簡単な例)次のテキストが与えられます:

public static int Add(int a, int b)
{
   return a + b;
}

これを表すメモリ内オブジェクト、または次のテキストのいずれかを取得したいと思います。

ParameterExpression a = Expression.Parameter(typeof(int), "a");
ParameterExpression b = Expression.Parameter(typeof(int), "b");
var expectedExpression = Expression.Lambda<Func<int, int, int>>(
        Expression.Add(a,b),
        a,
        b
    );

何か案は?誰かがおそらくこれを行うことができるRoslynで何かをしたことがありますか?

編集:明確化:任意のC#メソッド(たとえば、上記のメソッド)をテキストとして取り込み、結果の式を生成したいと思います。基本的に、私は任意のC#メソッドを式ツリーにコンパイルしようとしています。

4

4 に答える 4

8

はい、Roslynは実行できますが、Roslynには独自の式ツリー(構文ツリーと呼ばれます)があります。Roslynツールを使用すると、式またはステートメントをロードして実行できます。

Roslyn構文ツリーを式ツリーに変換するには、独自の構文ツリーウォーカーを作成する必要がありますが、すべてが正しく適合しない場合があります。

于 2011-11-15T18:49:52.753 に答える
1

なぜだめですか:

Expression<Func<int,int,int>> expr = (a,b) => a + b;
于 2011-11-15T18:42:50.147 に答える
1

次のbillchi_msの回答を参照してください:http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/e6364fec-29c5-4f1d-95ce-796feb25a8a9

簡単に言うと、私たちが提供するか、誰かがRoslynツリーをET v2に書き込むことができますが、RoslynツリーはVBとC#の完全な言語を表すことができますが、ET v2はできません(たとえば、型定義や一部のref関連のexpr)。

于 2011-11-17T23:48:25.760 に答える
0

式ツリー自体は、実行時にsまたはラムダ以外から生成されませんExpression(つまり、最初の加算ステートメントを実行可能ファイルから式ツリーとして取得することはできません)。ただし、C#コード(実行可能ファイルではない)でコードDOMを使用して、DOMから式ツリーへのトランスレーターを構築することはできます。

于 2011-11-15T18:41:24.347 に答える