プログラムコードで動的にラムダ式を作成する - C#
プログラムコードで動的にラムダ式を作成するコードを紹介します。
概要
ラムダ式をコード中に記述して処理を記述することがありますが、プログラムで動的にラムダ式を生成したい場合があります。この記事では、ラムダ式をプログラムコードで動的に生成する方法を紹介します。
ラムダ式を動的に生成するには、
System.Linq.Expressions
名前空間の Expressionクラスを利用します。また、ラムダ式をデリゲートにするためにはラムダ式のCompileメソッドを利用します。
プログラム例
引数を2つ受け取り、和を返すシンプルなラムダ式を生成するコードを記述します。
UI
下図の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) => x + y;
下記のコードでラムダ式のパラメーター(引数)を宣言します。今回は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 がテキストボックスに表示されます。
ラムダ式を動的に作成できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用