まずは手順解説
①MethodInfoを取得する
まず、TypeクラスのGetMethodメソッド(または、GetPropertyメソッド)を使用して、MethodInfoを取得します。このとき引数にメソッドに相当する文字列を指定します。該当するメソッドが存在しない場合は、戻り値はnullになります。
②Invokeメソッドから呼び出す
呼び出し方は、MethodInfoのInvokeメソッドを使用します。引数に、呼び出し元のインスタンスと、呼び出したメソッドの引数を配列で指定します。引数がない場合は、nullを指定してください。ソースコード
stringのToUpperメソッドを呼び出すには下のように書きます。string hoge = "hogehoge";
// string hogeUpper = hoge.ToUpper();
// 上記ToUpperメソッドの呼び出しに相当する書き方は下記の通り。
// ①MethodInfoを取得する
MethodInfo method = typeof(string).GetMethod("ToUpper");
// ②Invokeメソッドから呼び出す
string hogeUpper = method.Invoke(hoge, null).ToString();
この手の説明では、ここでいうメソッドが、どのメソッドのことを指すのかが紛らわしくなってしまいますが、あしからず。
文字列呼び出しを関数化する
文字列で指定したメソッドを呼び出す関数です。// using System.Reflection;
private object MethodInvoke<t>(T instance, string methodName,object[] param) {
Type type = typeof(T);
MethodInfo method = type.GetMethod(methodName);
if (method == null) {
return null;
}
return method.Invoke(instance,param);
}
書いてはみたものの、ぜんぜん便利そうなメソッドではないですね。
まあこんなの使わないで、普通に呼び出ししたほうが面倒くさくなくていいです。
おまけ
プロパティを指定するには、GetPropertyを呼び出します。PropertyInfoは、それぞれGetとSetを持っていて、メソッドとして呼び出しできるようになっております。もちろん、Setが許可されていないPropertyには使えません。
プロパティのGetの取得メソッドがGetGetMethodメソッドになります。
よくわかりませんね。英語に訳すと大変なことになりそうです。
GetGetMethodを取得するメソッドを書いてみましょう。
private MethodInfo GetGetGetMethod() {
Type type = typeof(PropertyInfo);
return type.GetMethod("GetGetMethod");
}
GetGetGetMethodって書きたかっただけでした…。@IT - 文字列で指定したメソッドを呼び出すには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/389methodinvoke/methodinvoke.html
0 件のコメント :
コメントを投稿