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