using System;
using System.Reflection;
namespace DynamicMethodCall
{
class A
{
public void Method1()
{
Console.WriteLine("Class A, Method 1");
}
public void Method2()
{
Console.WriteLine("Class A, Method 2");
}
}
class TestMain
{
[STAThread]
static void Main(string[] args)
{
string methodName = "";
A a = new A();
while (methodName != "exit")
{
Console.Write("Method name(exit: type 'exit'): ");
methodName = Console.ReadLine();
MethodInfo mi = typeof(A).GetMethod(methodName);
if (mi != null)
{
mi.Invoke(a, null);
}
}
}
}
}
실행하면Method name(exit: type 'exit'):
라고 묻습니다. 여기에 Method1 이나 Method2 (대소문자 주의)라고 입력하면, 해당 메소드가 실행이 됩니다.
여기를 보시면 :
MethodInfo mi = typeof(A).GetMethod(methodName);
if(mi != null)
{
mi.Invoke(a, null);
}
GetMethod 부분이 중요합니다. 이 메소드는 리플렉션을 사용하여 해당 Type에(즉, 클래스에) 있는 해당 메소드를 찾아줍니다. 반환형은 MethodInfo 이지요.만약 찾는 메소드가 없다면, null을 반환합니다.
반환된 메소드를 '실행'시키는 것은 Invoke의 몫입니다.
Invoke의 첫 번째 인자는 해당 클래스의 인스턴스입니다. 어떤 인스턴스의 메소드를 실행시킬 것인지 지정하는 거죠. 아시다시피, 하나의 클래스로 인스턴스는 무한히 만들 수 있기 때문에 '어떤 인스턴스의 메소드'인지가 중요합니다.
A a = new A();
여기서 A는 클래스, a는 인스턴스이지요. 구분 되시죠?
Invoke의 두 번째 인자는 파라메터 목록입니다. object[] 로 받게 되어 있습니다. 저는 인자를 받는 메소드가 없기 때문에 null입니다.
간단한 해석기를 만드는 데 유용하게 쓰일 수 있는 팁입니다.
추가로, Class 이름만 알고있으면 동적으로 Class를 찾아 그안의 매서드를 실행 할 수 있습니다.
public void Process(string className)
{
Module[] moduleArray;
moduleArray = Assembly.GetExecutingAssembly().GetModules(false);
Module myModule = moduleArray[0];
Type myType;
myType = myModule.GetType("namespace이름." + className.ToString(), false);
MethodInfo mi = myType.GetMethod("ProtocolProcess");
if (mi != null)
{
mi.Invoke(myType, null);
}
}
'Development > C#' 카테고리의 다른 글
| UTC 시차 극복 방법 (0) | 2009.08.27 |
|---|---|
| Amaizing! C# 4.0 (0) | 2009.03.12 |
| C# COM+ 등록방법 (0) | 2009.01.22 |
| CheckedListBox (0) | 2008.11.17 |
| 제네릭이란 무엇인가? (0) | 2008.11.17 |