読者です 読者をやめる 読者になる 読者になる

プログラミング C# - 翔ソフトウェア (Sho's)

C#/.NET/ソフトウェア開発など

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

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