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 f As Func(Of Integer, Integer) = Function(n)
' Dim sum As Integer = 0
' Do
' If n <= 0 Then Exit Do
' sum += n
' n -= 1
' Loop
' Return sum
'End Function
Dim n = Expression.Parameter(GetType(Integer), "n")
Dim sum = Expression.Parameter(GetType(Integer), "sum")
Dim brk = Expression.Label("break")
Dim body = Expression.Block(GetType(Integer), New ParameterExpression() {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
)
Dim lambda = Expression.Lambda(Of Func(Of Integer, Integer))(body, New ParameterExpression() {n})
Dim f = lambda.Compile()
Console.WriteLine(f(0))
Console.WriteLine(f(1))
Console.WriteLine(f(2))
Console.WriteLine(f(3))
Console.WriteLine(f(4))
End Sub
End Class
実行結果
0 1 3 6 10