본문 바로가기

C# 문법

Activator를 사용하여 런타임에 객체를 동적으로 생성하기

Activator.CreateInstance 란?

지정한 매개 변수와 가장 일치하는 생성자를 사용하여 지정한 유형의 인스턴스를 만듭니다.
Activator.CreateInstance(Type type, object[] params) 와 같이 되어 있습니다.

경험

업무를 하다 보면, 동적으로 User Control(object, Class, T..)를 생성해야 할 때가 있습니다. 이때 내가 Control의 Type 정보를 알고 있다면, 동적으로 생성할 방법을 알려드리겠습니다.

1.생성자에 매개변수가 없는 경우


public void Run()
{
    Type tmpType = typeof(PopupContent);
    //Type을 이용해 동적으로 Object를 생성
    var std = Activator.CreateInstance(tmpType);
}
/*******************************************************/
public class PopupContent
{
    public PopupContent()
    {
        Console.WriteLine("My Dictionary 블로그에 오신 걸 환영합니다.");
    }
}

2.생성자에 매개변수가 있는 경우


public void Run()
{
    Type tmpType = typeof(PopupContent);
    //매개변수가 있을경우, type 옆에 , 붙여 추가해 준다.
    var std = Activator.CreateInstance(tmpType, 
                "My Dictionary 블로그에 오신 걸 환영합니다.", 3 );
}
/*******************************************************/
public class PopupContent
{
    public PopupContent(string message, int cnt)
    {
        for(int i =0; i < cnt; i++)
        {
            Console.WriteLine(message);
        }
    }
}

결과


My Dictionary 블로그에 오신 걸 환영합니다.
My Dictionary 블로그에 오신 걸 환영합니다.
My Dictionary 블로그에 오신 걸 환영합니다.

응용 Generic Class를 동적으로 생성하기


public void Run()
{
    CreateClass< PopupContent>("My Dictionary 블로그에 오신 걸 환영합니다.", 2 );
}
//Generic Method 
public void CreateClass<T>(string msg, int cnt)
{
    //간단하게 앞에 (T)로 캐스팅만 해주면 됩니다! 
    var cls = (T) Activator.CreateInstance(typeof(T), msg, cnt);
}
/*******************************************************/
public class PopupContent
{
    public PopupContent(string message, int cnt)
    {
        for(int i =0; i < cnt; i++)
        {
            Console.WriteLine(message);
        }
    }
}

결과


My Dictionary 블로그에 오신 걸 환영합니다.
My Dictionary 블로그에 오신 걸 환영합니다.