メソッドではオーバーロードによって同じ名前のメソッドが複数存在する場合があり、また特にコンストラクタのオーバーロードではコンストラクタは名前を持たないため、名前だけでなく引数リストを用いて対象のオーバーロードを指定する必要があります。
例えばGetMethodの場合、名前のみでメソッドを取得しようとしたときにオーバーロードが複数存在する場合は、例外AmbiguousMatchExceptionがスローされます。
このようにメンバ名だけでは単一のメンバを限定できない場合は、引数リストを指定することによって取得対象を限定することができます。
引数リストは次の例のようにTypeの配列で指定します。 引数がない場合は空の配列か、Type.EmptyTypesフィールドを指定します。 引数の型・数・順序のすべてに一致するものがなければnull
/Nothing
が返されます。
引数リストを指定してメソッドのオーバーロードを限定して取得する
using System;
using System.Reflection;
class C {
public void M(int x) {}
public void M(long x) {}
public void M(int x, int y) {}
}
class Sample {
static void Main()
{
var t = typeof(C);
// int型の引数を1つとるメソッドMのオーバーロードを取得する
var m1 = t.GetMethod("M", new[] {typeof(int)});
// long型の引数を1つとるメソッドMのオーバーロードを取得する
var m2 = t.GetMethod("M", new[] {typeof(long)});
// int型の引数を2つとるメソッドMのオーバーロードを取得する
var m3 = t.GetMethod("M", new[] {typeof(int), typeof(int)});
Console.WriteLine(m1);
Console.WriteLine(m2);
Console.WriteLine(m3);
}
}
実行結果
Void M(Int32) Void M(Int64) Void M(Int32, Int32)
ジェネリックメソッドなど、型パラメータによってメンバを限定する必要がある場合については§.型パラメータを指定した取得 (ジェネリック型のメソッド/ジェネリックメソッドの取得)を参照してください。