MethodInfoやPropertyInfoなどのMemberInfo派生クラスを取得し、以下のメソッドを使うことでもメンバの呼び出しを行うことができます。 MethodInfoやPropertyInfoの取得にはGetMethodやGetPropertyなどのメソッドを使用します。
| メソッド | 動作 |
|---|---|
| MethodInfo.Invoke | 指定した引数と一致するメソッドを呼び出して戻り値を取得する |
| PropertyInfo.SetValue | プロパティに値を設定する |
| PropertyInfo.GetValue | プロパティの値を取得する |
| FieldInfo.SetValue | フィールドに値を設定する |
| FieldInfo.GetValue | フィールドの値を取得する |
| ConstructorInfo.Invoke | 指定した引数と一致するコンストラクタを呼び出してインスタンスを作成する |
コンストラクタ呼び出しの場合を除き、Type.InvokeMemberメソッドによるメンバ呼び出しの場合と同様に操作の対象となるインスタンスを引数objで指定します。 静的メンバ(static/Shared)の場合はインスタンスを指定する代わりにnull/Nothingを指定します。
また、メソッドおよびコンストラクタの呼び出し時に渡す引数は、object型の配列に格納して指定します。 フィールド・プロパティに設定する値をobject型の配列に格納して指定するInvokeMemberメソッドとは異なり、PropertyInfo.SetValueメソッド・FieldInfo.SetValueメソッドでは設定する値を直接引数として指定することができます。
MemberInfoを使ってメンバの呼び出しを行う
Imports System
Imports System.Reflection
Class C
Public Function M(ByVal s As String) As String
Return s.ToUpper()
End Function
Public F As Double = 0.0
End Class
Class Sample
Shared Sub Main()
Dim t As Type = GetType(C)
Dim inst As Object = Activator.CreateInstance(t)
' メソッドMのMethodInfoを取得する
Dim m As MethodInfo = t.GetMethod("M")
' メソッドを呼び出す
Dim ret As Object = m.Invoke(inst, New Object() {"Hello, world!"})
Console.WriteLine(ret) ' メソッドの戻り値を表示する
' フィールドFのFieldInfoを取得する
Dim f As FieldInfo = t.GetField("F")
' フィールドに値3.14を設定する
f.SetValue(inst, 3.14)
' フィールドの値を取得する
Console.WriteLine("F = {0}", f.GetValue(inst))
End Sub
End Class
実行結果
HELLO, WORLD! F = 3.14
これらのメソッドでは、メンバの呼び出しを行うインスタンスや設定する値はすべてobject型の引数に渡します。 この際、構造体など値型インスタンスのフィールド・プロパティを設定する際には問題が生じる場合があります。
この問題と回避方法に関してはリフレクションを使って構造体フィールドに値を設定する(FieldInfo.SetValue)で解説しているので、合わせてご覧ください。