[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 でラムダ式をツリー上に組立て、コンパイルすることで、これをデリゲートとして実行することができる。