Type.InvokeMemberメソッドを使うと型情報とメンバ名を使ってメンバの呼び出しを行うことができます。 InvokeMemberメソッドでは、メソッドの呼び出しのほか、プロパティの値の取得・設定、フィールドの値の取得・設定を行うことができます。 またコンストラクタを呼び出すことによってインスタンスを作成することもできます。 呼び出すメンバに応じて、次のBindingFlagsのいずれかを指定します。

InvokeMemberメソッドとBindingFlags
BindingFlags InvomeMemberメソッドの動作
BindingFlags.InvokeMethod 指定した名前・引数と一致するメソッドを呼び出して戻り値を取得する
BindingFlags.SetProperty 指定した名前のプロパティに値を設定する
BindingFlags.GetProperty 指定した名前のプロパティの値を取得する
BindingFlags.SetField 指定した名前のフィールドに値を設定する
BindingFlags.GetField 指定した名前のフィールドの値を取得する
BindingFlags.CreateInstance 指定した引数と一致するコンストラクタを呼び出してインスタンスを作成する

これらの値に加えて、非パブリックメンバを呼び出したり、メンバ名の大文字小文字の違いを無視して呼び出せるようにするためにBindingFlags.NonPublicやBindingFlags.IgnoreCaseなどを組み合わせて指定することもできます。

InvokeMemberメソッドでは、第4引数に操作の対象となるインスタンスを指定します。 静的メンバ(static/Shared)の場合はインスタンスを指定する代わりにnull/Nothingを指定します。 メソッドおよびコンストラクタの呼び出し時に渡す引数や、フィールド・プロパティに設定する値は、object型の配列に格納して第5引数に指定します。 引数がない場合はnull/Nothingを指定します。

また、BindingFlags.InvokeMethodで呼び出したメソッドの戻り値や、BindingFlags.CreateInstanceで作成したインスタンス、BindingFlags.GetPropertyおよびBindingFlags.GetFieldで取得したプロパティ・フィールドの値はInvokeMemberメソッドの戻り値として取得することができます。

Type.InvokeMemberを使ってメンバの呼び出しを行う
Imports System
Imports System.Reflection

Class C
  Public Function M(ByVal s As String) As String
    Return s.ToUpper()
  End Function

  Public Property P As Integer

  Public F As Double = 0.0
End Class

Class Sample
  Shared Sub Main()
    Dim t As Type = GetType(C)

    Dim inst As Object = Activator.CreateInstance(t)

    ' インスタンスのメソッドMを呼び出す
    Dim ret As Object = t.InvokeMember("M", BindingFlags.InvokeMethod, Nothing, inst, New Object() {"Hello, world!"})

    Console.WriteLine(ret) ' メソッドの戻り値を表示する

    ' プロパティPに値42を設定する
    t.InvokeMember("P", BindingFlags.SetProperty, Nothing, inst, New Object() {42})

    ' プロパティPの値を取得する
    Dim p As Object = t.InvokeMember("P", BindingFlags.GetProperty, Nothing, inst, Nothing)

    Console.WriteLine("P = {0}", p)

    ' フィールドFに値3.14を設定する
    t.InvokeMember("F", BindingFlags.SetField, Nothing, inst, New Object() {3.14})

    ' フィールドFの値を取得する
    Dim f As Object = t.InvokeMember("F", BindingFlags.GetField, Nothing, inst, Nothing)

    Console.WriteLine("F = {0}", f)
  End Sub
End Class
実行結果
HELLO, WORLD!
P = 42
F = 3.14

メンバ呼び出しの結果例外が発生した場合、TargetInvocationExceptionがスローされます。 実際にスローされた例外を取得する方法などについて詳細は§.呼び出し時の例外 (TargetInvocationException)を参照してください。