Typeクラスで参照できる型情報には戻り値や引数に関する情報は含まれないため、デリゲート型を表すTypeインスタンスからはデリゲートのシグネチャを直接知ることができない。 そこで、デリゲート型が持つInvokeメソッドのMethodInfoを取得し、そこから必要な情報を参照することでデリゲートのシグネチャを知ることができる。
using System;
using System.Reflection;
class Sample {
static void Main()
{
PrintDelegateSignature(typeof(EventHandler));
PrintDelegateSignature(typeof(Action<>));
PrintDelegateSignature(typeof(Func<,,,,>));
PrintDelegateSignature(typeof(System.Text.RegularExpressions.MatchEvaluator));
}
private static void PrintDelegateSignature(Type typeOfDelegate)
{
MethodInfo signature = typeOfDelegate.GetMethod("Invoke");
Console.Write("{0} {1}(", signature.ReturnType.Name, typeOfDelegate.FullName);
bool first = true;
foreach (ParameterInfo p in signature.GetParameters()) {
if (first)
first = false;
else
Console.Write(", ");
Console.Write("{0} {1}", p.ParameterType.Name, p.Name);
}
Console.WriteLine(")");
}
}
実行結果
Void System.EventHandler(Object sender, EventArgs e) Void System.Action`1(T obj) TResult System.Func`5(T1 arg1, T2 arg2, T3 arg3, T4 arg4) String System.Text.RegularExpressions.MatchEvaluator(Match match)