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
참고자료
'C# 문법' 카테고리의 다른 글
[C#] Stopwatch를 이용해 경과시간 가져오기 (0) | 2021.12.16 |
---|---|
[C#] IP, SubnetMask, Gateway 정보 가져오기 (0) | 2021.12.15 |
Activator를 사용하여 런타임에 객체를 동적으로 생성하기 (0) | 2021.12.14 |
[C#] Linq에서 값이 존재하는지 확인, Any, ALL, Exist (0) | 2021.12.08 |
[C#] XML Serialization / Deserialization (0) | 2021.12.05 |