System.Linq.Expressions名前空間のクラスを使って式木(expression tree, 式ツリーとも)を作成することによっても実行可能なコードを動的に生成することができます。 .NET Framework 4以降では、式だけでなく条件分岐やループなどのブロック構文も扱うことができるようになっています。 式木では生成したコードをデリゲートに変換(コンパイル)し、任意に呼び出すことができます。
System.Linq.Expressions名前空間のクラスを使って単純な式木を構築して呼び出す
using System;
using System.Linq.Expressions;
class Sample {
static void Main()
{
// 以下のラムダ式と同様の式木を生成する
// Action<string> a = s => Console.WriteLine(s.ToUpper());
// 式木に渡されるパラメータ(string型)
var s = Expression.Parameter(typeof(string), "s");
// Console.WriteLine(param.ToUpper())に相当する式木を生成する
var printUpperCase = Expression.Call(
typeof(Console).GetMethod("WriteLine", new[] {typeof(string)}),
Expression.Call(s, typeof(string).GetMethod("ToUpper", Type.EmptyTypes))
);
// 式木を構成してラムダ式に変換する
var lambda = Expression.Lambda<Action<string>>(printUpperCase, new[] {s});
// デリゲートに変換する
var a = lambda.Compile();
// 変換したデリゲートに引数を渡して呼び出す
a("Hello, world!");
}
}
実行結果
Hello, world!