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