본문으로 바로가기

동적 메서드 호출

category Development/C# 2009. 2. 4. 16:12
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