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 |