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を使ってメンバの呼び出しを行う
using System;
using System.Reflection;
class C {
public string M(string s)
{
return s.ToUpper();
}
public double F = 0.0;
}
class Sample {
static void Main()
{
var t = typeof(C);
var inst = Activator.CreateInstance(t);
// メソッドMのMethodInfoを取得する
var m = t.GetMethod("M");
// メソッドを呼び出す
var ret = m.Invoke(inst, new object[] {"Hello, world!"});
Console.WriteLine(ret); // メソッドの戻り値を表示する
// フィールドFのFieldInfoを取得する
var f = t.GetField("F");
// フィールドに値3.14を設定する
f.SetValue(inst, 3.14);
// フィールドの値を取得する
Console.WriteLine("F = {0}", f.GetValue(inst));
}
}
実行結果
HELLO, WORLD! F = 3.14
これらのメソッドでは、メンバの呼び出しを行うインスタンスや設定する値はすべてobject
型の引数に渡します。 この際、構造体など値型インスタンスのフィールド・プロパティを設定する際には問題が生じる場合があります。
この問題と回避方法に関してはリフレクションを使って構造体フィールドに値を設定する(FieldInfo.SetValue)で解説しているので、合わせてご覧ください。