プログラムコードで動的にラムダ式を作成する - 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を愛用
掲載日: 2020-01-09
iPentec all rights reserverd.