プログラミング系のネタをまとめていきます。

概要

リフレクションを使ってできること。
  • アセンブリ内のクラス、型を列挙する。
  • クラス、型のメンバにアクセスする。
  • クラス、型のインスタンスを作成する。
  • 動的にクラス、型を生成する。

InvokeMember


System.Type.InvokeMember() を利用して、文字列でメソッドを呼び出すことが出来ます。

まずはサンプルクラス。
class Class1
{
	public void PublicMethod()
	{
		Console.WriteLine(">>> PublicMethod");
	}

	public int MethodArgument2(int v1, int v2)
	{
		int ret = v1+v2;
		Console.WriteLine(string.Format(">>> MethodArgument2 : {0} + {1} = {2}",v1,v2,ret));
		return ret;
	}

	public static void StaticMethod()
	{
		Console.WriteLine(">>> StaticMethod");
	}

	private void PrivateMethod()
	{
		Console.WriteLine(">>> PrivateMethod");
	}
}

InvokeMember を使って、それぞれのメソッドを呼び出します。

using System.Reflection;

// Class1の型情報
Type type = typeof(Class1);

// 型情報からインスタンスを生成
object instance = type.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);

// publicメソッド呼び出し
type.InvokeMember("PublicMethod", BindingFlags.InvokeMethod, null, instance, null);

// 引数、返り値ありのメソッド
object ret = type.InvokeMember("MethodArgument2", BindingFlags.InvokeMethod, null, instance, new object[] { 1, 2 });
Console.WriteLine("    return value : " + ret);

// staticメソッド呼び出し
type.InvokeMember("StaticMethod", BindingFlags.InvokeMethod, null, null, null);

// privateメソッド呼び出し
// ※通常は外部から呼び出せない privateメソッドまで呼び出せる。
type.InvokeMember("PrivateMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, instance, null);

実行結果

>>> PublicMethod
>>> MethodArgument2 : 1 + 2 = 3
    return value : 3
>>> StaticMethod
>>> PrivateMethod

他にも、プロパティの取得、設定、インデクサ等、全てのアクセスができます。

参考サイト


型のメンバを動的に呼び出す: .NET Tips: C#, VB.NET
http://dobon.net/vb/dotnet/programing/typeinvokeme...

メソッドの情報を列挙する


System.Type.GetMethods() を利用して、メソッドの情報を調べることが出来ます。

上記クラス Class1 を使ったサンプルコード。
Type type = typeof(Class1);
MethodInfo[] methodInfo = type.GetMethods();
foreach (MethodInfo mi in methodInfo)
{
	Console.WriteLine(string.Format("{0} : ret {1}", mi.Name, mi.ReturnType.ToString()));	// メソッド名と返り値の型
	if (mi.IsStatic) Console.WriteLine("    static");
	if (mi.IsPublic) Console.WriteLine("    public");
	if (mi.IsPrivate) Console.WriteLine("    private");
}

実行結果
ベースクラスの ToString, Equals, GetHashCode, GetType も出力されています。

PublicMethod : ret System.Void
    public
MethodArgument2 : ret System.Int32
    public
StaticMethod : ret System.Void
    static
    public
ToString : ret System.String
    public
Equals : ret System.Boolean
    public
GetHashCode : ret System.Int32
    public
GetType : ret System.Type
    public

同様に、
System.Type.GetMembersSystem.Type.GetInterfacesSystem.Type.GetProperties など、クラスに関する情報は全て調べることができます。
タグ

Menu

メインコンテンツ

プログラミング

機器

Macツール

各種情報

Wiki内検索

おまかせリンク

Androidアプリ

AdSense

技術書


管理人/副管理人のみ編集できます