Delegate.CreateDelegateメソッドを使うとMethodInfoをデリゲートに変換することができ、デリゲートを介してメソッドの呼び出しを行えるようになります。
CreateDelegateメソッドの引数には、取得したいデリゲートの型を指定します。 デリゲートの型とMethodInfoが表すメソッドのシグネチャは一致している必要があります。 また、インスタンスメソッドの場合は呼び出し対象のインスタンスを指定します。 クラスメソッド(静的メソッド)の場合はインスタンスを指定する必要はありません。 CreateDelegateメソッドの戻り値はDelegateなので、作成したデリゲートを呼び出す場合は適切な型にキャストしてから呼び出す必要があります。
MethodInfoからデリゲートを作成し、デリゲートを介してメソッドを呼び出す
Imports System
Imports System.Reflection
Class C
Public Sub M1(ByVal s As String)
Console.WriteLine(s)
End Sub
Public Shared Sub M2(ByVal s As String)
Console.WriteLine(s)
End Sub
End Class
Class Sample
Shared Sub Main()
Dim inst As New C()
Dim t As Type = GetType(C)
' インスタンスメソッドM1のMethodInfoからデリゲートを作成する
Dim m1 As MethodInfo = t.GetMethod("M1")
Dim a1 As Action(Of String) = DirectCast([Delegate].CreateDelegate(GetType(Action(Of String)), inst, m1), Action(Of String))
a1("Hello, world!") ' 作成したデリゲートを介してメソッドを呼び出す
' クラスメソッドM2のMethodInfoからデリゲートを作成する
Dim m2 As MethodInfo = t.GetMethod("M2")
Dim a2 As Action(Of String) = DirectCast([Delegate].CreateDelegate(GetType(Action(Of String)), m2), Action(Of String))
a2("Hello, world!")
End Sub
End Class
実行結果
Hello, world! Hello, world!