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を使ってメンバの呼び出しを行う
using System;
using System.Reflection;

class C {
  public string M(string s)
  {
    return s.ToUpper();
  }

  public int P { get; set; }

  public double F = 0.0;
}

class Sample {
  static void Main()
  {
    Type t = typeof(C);

    object inst = Activator.CreateInstance(t);

    // インスタンスのメソッドMを呼び出す
    object ret = t.InvokeMember("M", BindingFlags.InvokeMethod, null, inst, new object[] {"Hello, world!"});

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

    // プロパティPに値42を設定する
    t.InvokeMember("P", BindingFlags.SetProperty, null, inst, new object[] {42});

    // プロパティPの値を取得する
    object p = t.InvokeMember("P", BindingFlags.GetProperty, null, inst, null);

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

    // フィールドFに値3.14を設定する
    t.InvokeMember("F", BindingFlags.SetField, null, inst, new object[] {3.14});

    // フィールドFの値を取得する
    object f = t.InvokeMember("F", BindingFlags.GetField, null, inst, null);

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

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