본문 바로가기

C# 문법

[C#] Reflection을 이용하여 동적으로 값을 넣기

Reflection

  • 리플렉션을 사용하면 동적으로 형식 인스턴스를 만들거나, 형식을 기존 개체에 바인딩하거나, 기존 개체에서 형식을 가져와 해당 메서드를 호출하거나, 필드 및 속성에 액세스할 수 있습니다.

경험

일을 하다 보면, Class에 선언된 Property / Field에 값을 넣어야 하는 경우가 있습니다. 그때 런타임 시점에서 동적으로 값을 넣는 방법에 관해 알아보겠습니다.

1. Property


public void Run()
{
    Student std = new Student();

    //Student Class에 Property 를 모두 가지고 온다.
    PropertyInfo[] pArr = typeof(Student).GetProperties();

    foreach (var pInfo in pArr)
    {
        //Property의 타입, 이름, 값을 확인
        Console.WriteLine($"Property Name : {pInfo.Name}");
        Console.WriteLine($"Property Type : {pInfo.PropertyType}");
        Console.WriteLine($"Property Value : {pInfo.GetValue(std)}");

        //Property의 이름이 Name 이라면 다른 값을 넣어주자
        if (pInfo.Name.Equals("Name"))
            pInfo.SetValue(std, "양뱅"); //SetValue로 값을 넣는다.
        //Property의 이름이 Age 이라면 다른 값을 넣어주자
        if (pInfo.Name.Equals("Age"))
            pInfo.SetValue(std, 03);
    }

    //변경된 값 확인
    Console.WriteLine($"{std.Name} : {std.Age}");
}
/*******************************************************/
public class Student //Property로 선언
{
    public string Name { get; set; }
    public int Age { get; set; }
}

2.Field (Property -> Field로 변경))


public void Run()
{
    Student std = new Student();

    //Student Class에 Property 를 모두 가지고 온다.
    FieldInfo[] pArr = typeof(Student).GetFields();

    foreach (FieldInfo pInfo in pArr)
    {
        //Property의 타입, 이름, 값을 확인
        Console.WriteLine($"Property Name : {pInfo.Name}");
        Console.WriteLine($"Property Type : {pInfo.FieldType}");
        Console.WriteLine($"Property Value : {pInfo.GetValue(std)}");

        //Property의 이름이 Name 이라면 다른 값을 넣어주자
        if (pInfo.Name.Equals("Name"))
            pInfo.SetValue(std, "양뱅"); //SetValue로 값을 넣는다.
        //Property의 이름이 Age 이라면 다른 값을 넣어주자
        if (pInfo.Name.Equals("Age"))
            pInfo.SetValue(std, 03);
    }

    //변경된 값 확인
    Console.WriteLine($"{std.Name} : {std.Age}");
}
/*******************************************************/
public class Student //Field로 선언
{
    public string Name = "춘남";
    public int Age = 33;
}

3.결과 화면

Property Name : Name
Property Type : System.String
Property Value : 춘남
Property Name : Age
Property Type : System.Int32
Property Value : 33
양뱅 : 3

응용편 Generic 변수(T)에 값을 넣기

public void Run()
{
    Student std = new Student();
    UseGenericMethod<Student>(std);

    //변경된 값 확인
    Console.WriteLine($"{std.Name} : {std.Age}");
}
private void UseGenericMethod<T>(T cls)
{
    //T가 어떤 값인지 모르지만 그안에 들어있는 Property만 가지고 오겠다
    foreach (var pInfo in typeof(T).GetProperties())
    {
        //Property의 타입, 이름, 값을 확인
        Console.WriteLine($"Property Name : {pInfo.Name}");
        Console.WriteLine($"Property Type : {pInfo.PropertyType}");
        Console.WriteLine($"Property Value : {pInfo.GetValue(cls)}");

        //Property의 이름이 Name 이라면 다른 값을 넣어주자
        if (pInfo.Name.Equals("Name"))
            pInfo.SetValue(cls, "양뱅"); //SetValue로 값을 넣는다.
        //Property의 이름이 Age 이라면 다른 값을 넣어주자
        if (pInfo.Name.Equals("Age"))
            pInfo.SetValue(cls, 03);
    }
}
/*******************************************************/
public class Student
{
    public string Name { get; set; } = "춘남";
    public int Age = 33;
}

결과

Property Name : Name
Property Type : System.String
Property Value : 춘남
양뱅 : 33

참고자료

MSDN