System.Linq.Expressions名前空間のクラスを使って式木(expression tree, 式ツリーとも)を作成することによっても実行可能なコードを動的に生成することができます。 .NET Framework 4以降では、式だけでなく条件分岐やループなどのブロック構文も扱うことができるようになっています。 式木では生成したコードをデリゲートに変換(コンパイル)し、任意に呼び出すことができます。
System.Linq.Expressions名前空間のクラスを使って複雑な構文を含む式木を構築して呼び出す
using System;
using System.Linq.Expressions;
class Sample {
static void Main()
{
// 以下のラムダ式と同様の式木を生成する
/*
Func<int, int> f = n => {
int sum = 0;
for (;;) {
if (n <= 0)
break;
sum += n;
n -= 1;
}
return sum;
};
*/
var n = Expression.Parameter(typeof(int), "n");
var sum = Expression.Parameter(typeof(int), "sum");
var brk = Expression.Label("break");
var body = Expression.Block(typeof(int), new[] {sum},
Expression.Assign(sum, Expression.Constant(0)),
Expression.Loop(
Expression.Block(
Expression.IfThen(
Expression.LessThanOrEqual(n, Expression.Constant(0)),
Expression.Break(brk)
),
Expression.AddAssign(sum, n),
Expression.SubtractAssign(n, Expression.Constant(1))
),
brk
),
sum
);
var lambda = Expression.Lambda<Func<int, int>>(body, new[] {n});
var f = lambda.Compile();
Console.WriteLine(f(0));
Console.WriteLine(f(1));
Console.WriteLine(f(2));
Console.WriteLine(f(3));
Console.WriteLine(f(4));
}
}
実行結果
0 1 3 6 10