Delegate.CreateDelegateメソッドを使うとMethodInfoをデリゲートに変換することができ、デリゲートを介してメソッドの呼び出しを行えるようになります。
CreateDelegateメソッドの引数には、取得したいデリゲートの型を指定します。 デリゲートの型とMethodInfoが表すメソッドのシグネチャは一致している必要があります。 また、インスタンスメソッドの場合は呼び出し対象のインスタンスを指定します。 クラスメソッド(静的メソッド)の場合はインスタンスを指定する必要はありません。 CreateDelegateメソッドの戻り値はDelegateなので、作成したデリゲートを呼び出す場合は適切な型にキャストしてから呼び出す必要があります。
MethodInfoからデリゲートを作成し、デリゲートを介してメソッドを呼び出す
using System;
using System.Reflection;
class C {
public void M1(string s)
{
Console.WriteLine(s);
}
public static void M2(string s)
{
Console.WriteLine(s);
}
}
class Sample {
static void Main()
{
var inst = new C();
var t = typeof(C);
// インスタンスメソッドM1のMethodInfoからデリゲートを作成する
var m1 = t.GetMethod("M1");
var a1 = (Action<string>)Delegate.CreateDelegate(typeof(Action<string>), inst, m1);
a1("Hello, world!"); // 作成したデリゲートを介してメソッドを呼び出す
// クラスメソッドM2のMethodInfoからデリゲートを作成する
var m2 = t.GetMethod("M2");
var a2 = (Action<string>)Delegate.CreateDelegate(typeof(Action<string>), m2);
a2("Hello, world!");
}
}
実行結果
Hello, world! Hello, world!