メソッドではオーバーロードによって同じ名前のメソッドが複数存在する場合があり、また特にコンストラクタのオーバーロードではコンストラクタは名前を持たないため、名前だけでなく引数リストを用いて対象のオーバーロードを指定する必要があります。
例えばGetMethodの場合、名前のみでメソッドを取得しようとしたときにオーバーロードが複数存在する場合は、例外AmbiguousMatchExceptionがスローされます。
取得しようとするメンバが限定できない場合、AmbiguousMatchExceptionがスローされる
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);
// 名前のみを指定してメソッドMのMethodInfoを取得しようとする
// M(int)とM(long)とM(int, int)のどれが取得されるべき対象なのか曖昧なので、
// 例外AmbiguousMatchExceptionがスローされる
var m = t.GetMethod("M");
}
}
実行結果
Unhandled exception. System.Reflection.AmbiguousMatchException: Ambiguous match found. at System.RuntimeType.GetMethodImplCommon(String name, Int32 genericParameterCount, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers) at System.RuntimeType.GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers) at System.Type.GetMethod(String name, BindingFlags bindingAttr) at System.Type.GetMethod(String name) at Sample.Main()
このようにメンバ名だけでは単一のメンバを限定できない場合は、引数リストを指定することによって取得対象を限定することができます。
引数リストは次の例のようにTypeの配列で指定します。 引数がない場合は空の配列か、Type.EmptyTypesフィールドを指定します。 引数の型・数・順序のすべてに一致するものがなければnull
/Nothing
が返されます。
ジェネリックメソッドなど、型パラメータによってメンバを限定する必要がある場合については§.型パラメータを指定した取得 (ジェネリック型のメソッド/ジェネリックメソッドの取得)を参照してください。