プログラムコードで動的にラムダ式を作成するコードを紹介します。
ラムダ式をコード中に記述して処理を記述することがありますが、プログラムで動的にラムダ式を生成したい場合があります。この記事では、ラムダ式をプログラムコードで動的に生成する方法を紹介します。
ラムダ式を動的に生成するには、System.Linq.Expressions
名前空間の Expressionクラスを利用します。また、ラムダ式をデリゲートにするためにはラムダ式のCompileメソッドを利用します。
引数を2つ受け取り、和を返すシンプルなラムダ式を生成するコードを記述します。
下図のUIを作成します。フォームにテキストボックスとボタンを1つずつ配置します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Linq.Expressions;
namespace LambdaDelegate
{
public partial class FormSimpleCompile : Form
{
public FormSimpleCompile()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ParameterExpression paramX = Expression.Parameter(typeof(int), "x");
ParameterExpression paramY = Expression.Parameter(typeof(int), "y");
BinaryExpression body = Expression.Add(paramX, paramY);
Expression<Func<int, int, int>> lamda = Expression.Lambda<Func<int, int, int>>(body, paramX, paramY);
Func<int, int, int> lamdaDelegate = lamda.Compile();
textBox1.Text = lamdaDelegate(12, 5).ToString();
}
}
}
今回のコードでは下記のラムダ式を作成します。
下記のコードでラムダ式のパラメーター(引数)を宣言します。今回はx, yの2つのパラメーターを利用します。
ParameterExpression paramX = Expression.Parameter(typeof(int), "x");
ParameterExpression paramY = Expression.Parameter(typeof(int), "y");
ラムダ式の実装を作成します。今回は2つのパラメーターの和をとるため、Addメソッドを呼び出し、2つのパラメーターの和をとる実装をします。式は
BinaryExpression オブジェクトで返されます。
BinaryExpression body = Expression.Add(paramX, paramY);
x+y
の場合はAddメソッドを利用しますが、x-y
の場合は Subtractメソッドを、x*y
の場合は Multiply メソッドを、x/y
の場合はDivideメソッドを x%y
の場合はModulo メソッドを利用します。
比較演算子の場合は <
の場合は LessThan <=
の場合は LessThanOrEqual >
の場合はGreaterThan >=
の場合はGreaterThanOrEqual を利用します。
下記のコードでラムダ式を作成します。Expression.Lambda() メソッドでラムダ式を作成します。ラムダ式はint型のパラメーター2つを取り、int型の戻り値を返すメソッドのタイプのExpression型である Expression<Func<int,int,int>>
のオブジェクトになります。
Expression<Func<int, int, int>> lamda = Expression.Lambda<Func<int, int, int>>(body, paramX, paramY);
作成したラムダ式のCompileメソッドを呼び出し、デリゲートにコンパイルします。
Func<int, int, int> lamdaDelegate = lamda.Compile();
デリゲートを呼び出し戻り値の値をテキストボックスに表示します。
textBox1.Text = lamdaDelegate(12, 5).ToString();
プロジェクトを実行します。下図のウィンドウが表示されます。
ウィンドウの[button1]をクリックします。コードに記述したx=12
, y=5
の値で (x,y)=>x+y
のラムダ式が実行されます。式の結果である 17 がテキストボックスに表示されます。
ラムダ式を動的に作成できました。