« [C#][dynamic] 動的にイベント ハンドラーを追加 | メイン | [C#][dynamic] リフレクション Q&A »

[C#][ラムダ式][式木] Expression でラムダ式を作成してデリゲートとして実行する

Expression

以前「Expression の構造を調べてみる」と云う記事で、Expression の内部のツリー構造を調べた。

その中で、ラムダ式として足し算を行うだけの (x, y) => x + y と云うシンプルなラムダ式を Expression で受け、その構造を調べた。

using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        Expression<Func<int, int, int>> expression = (x, y) => x + y;
    }
}

今回は、逆に Expression でラムダ式を作成し、これをデリゲートとして実行してみよう。

■ 今回のサンプルプログラム

今回のサンプルプログラムは次の通りだ。

using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        // ラムダ式の Parameter の x
        ParameterExpression parameterX = Expression.Parameter(typeof(int), "x");
        // ラムダ式の Parameter の y
        ParameterExpression parameterY = Expression.Parameter(typeof(int), "y");

        // ラムダ式の Body: x + y
        BinaryExpression body = Expression.Add(parameterX, parameterY);

        // ラムダ式: Parameter の x と y、Body で作成
        Expression<Func<int, int, int>> lamda = Expression.Lambda<Func<int, int, int>>(body, parameterX, parameterY);

        // ラムダ式をコンパイルしてデリゲートを生成
        Func<int, int, int> lamdaDelegate = lamda.Compile();

        // 実行してみる: result が 3 になる
        int result = lamdaDelegate(1, 2);
    }
}

このように、Expression でラムダ式をツリー上に組立て、コンパイルすることで、これをデリゲートとして実行することができる。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2013年06月14日 23:00に投稿されたエントリーのページです。

ひとつ前の投稿は「[C#][dynamic] 動的にイベント ハンドラーを追加」です。

次の投稿は「[C#][dynamic] リフレクション Q&A」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35