C#メモ リフレクションを使ってメソッドを文字列で呼び出してみる

テキストでばばっとメソッドを呼び出せないもんかと思って、いろいろ調べてたらリフレクションって仕組みがあるんだね…知らなんだ…。

ってことで、試してみる。

手順としてはこんな感じ。

  1. Type.GetType()メソッドでクラスの型を取得する
  2. Activator.CreateInstance()メソッドでクラスの型を頼りにインスタンスを生成する
  3. Type.GetMethod()メソッドでメソッド属性を取得する
  4. MethodInfo.Invoke()メソッドでメソッド属性を頼りにメソッドを呼ぶ

で、コード。
まずは、呼び出される方(メソッドを含むクラス)はこんな感じにした。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
namespace Proto
{
class Temporary
{
/// <summary>
/// コンストラクタ
/// </summary>
public Temporary()
{
System.Console.WriteLine("Temporary.Temporary()");
}
/// <summary>
/// 呼び出すメソッド
/// </summary>
public void Function()
{
System.Console.WriteLine("Temporary.Function()");
}
}
}
namespace Proto { class Temporary { /// <summary> /// コンストラクタ /// </summary> public Temporary() { System.Console.WriteLine("Temporary.Temporary()"); } /// <summary> /// 呼び出すメソッド /// </summary> public void Function() { System.Console.WriteLine("Temporary.Function()"); } } }
namespace Proto
{
	class Temporary
	{
		/// <summary>
		/// コンストラクタ
		/// </summary>
		public Temporary()
		{
			System.Console.WriteLine("Temporary.Temporary()");
		}

		/// <summary>
		/// 呼び出すメソッド
		/// </summary>
		public void Function()
		{
			System.Console.WriteLine("Temporary.Function()");
		}
	}
}

次に呼び出す方。
System.Reflectionっていうnamespaceを余分に定義しとく。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
using System.Reflection;
using System.Reflection;
using System.Reflection;

で、コードはこんな感じ。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
try
{
// クラスの型を取得する
Type type = Type.GetType("Proto.Temporary"); // ここはnamespaceを含めたクラス名を指定する
// クラスの型を頼りにインスタンスを生成する
object temporary = System.Activator.CreateInstance(type);
// メソッド属性を取得する
MethodInfo methodinfo = type.GetMethod("Function");
// メソッド属性を頼りにメソッドを呼ぶ
methodinfo.Invoke(temporary, null);
}
catch(Exception ex)
{
System.Console.WriteLine(ex.Message);
}
finally
{
System.Console.WriteLine("finish");
}
try { // クラスの型を取得する Type type = Type.GetType("Proto.Temporary"); // ここはnamespaceを含めたクラス名を指定する // クラスの型を頼りにインスタンスを生成する object temporary = System.Activator.CreateInstance(type); // メソッド属性を取得する MethodInfo methodinfo = type.GetMethod("Function"); // メソッド属性を頼りにメソッドを呼ぶ methodinfo.Invoke(temporary, null); } catch(Exception ex) { System.Console.WriteLine(ex.Message); } finally { System.Console.WriteLine("finish"); }
try
{
	// クラスの型を取得する
	Type type = Type.GetType("Proto.Temporary");    // ここはnamespaceを含めたクラス名を指定する

	// クラスの型を頼りにインスタンスを生成する
	object temporary = System.Activator.CreateInstance(type);

	// メソッド属性を取得する
	MethodInfo methodinfo = type.GetMethod("Function");

	// メソッド属性を頼りにメソッドを呼ぶ
	methodinfo.Invoke(temporary, null);
}
catch(Exception ex)
{
	System.Console.WriteLine(ex.Message);
}
finally
{
	System.Console.WriteLine("finish");
}

実行してみるとこんな感じ。
TemporaryってクラスのコンストラクタとFunction()ってメソッドが呼び出された。

22183_02

んまま、メモってことで。