C#에서 객체의 속성 값을 동적으로 읽어오려면 리플렉션(Reflection)을 활용할 수 있습니다.
리플렉션은 어셈블리, 모듈, 타입(Type)을 설명하는 객체를 제공합니다. 이를 통해 런타임에 특정 타입의 인스턴스를 동적으로 생성하거나, 기존 객체에 타입을 바인딩하거나, 기존 객체로부터 타입 정보를 얻어 메서드를 호출하고 필드·속성에 접근할 수 있습니다. 또한 코드에서 특성(Attribute)을 사용했다면 리플렉션을 통해 해당 특성에도 접근할 수 있습니다.
.NET 리플렉션에서 핵심적인 역할을 하는 것은 System.Reflection 네임스페이스와 System.Type 클래스입니다. 이 둘은 서로 긴밀하게 동작하며, 타입의 다양한 정보를 런타임에 조사할 수 있게 해줍니다.
예제 코드
using System;
using System.Text;
namespace DemoApplication {
public class Program {
static void Main(string[] args) {
var employeeType = typeof(Employee);
var employee = Activator.CreateInstance(employeeType);
SetPropertyValue(employeeType, "EmployeeId", employee, 1);
SetPropertyValue(employeeType, "EmployeeName", employee, "Mark");
GetPropertyValue(employeeType, "EmployeeId", employee);
GetPropertyValue(employeeType, "EmployeeName", employee);
Console.ReadLine();
}
static void SetPropertyValue(Type type, string propertyName, object instanceObject, object value) {
type.GetProperty(propertyName).SetValue(instanceObject, value);
}
static void GetPropertyValue(Type type, string propertyName, object instanceObject) {
Console.WriteLine($"Value of Property {propertyName}: {type.GetProperty(propertyName).GetValue(instanceObject, null)}");
}
}
public class Employee {
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Value of Property EmployeeId: 1 Value of Property EmployeeName: Mark
위 예제에서는 typeof()로 Employee 타입 정보를 얻고, Activator.CreateInstance()로 인스턴스를 동적으로 생성한 뒤, 속성 이름을 지정하여 값을 설정했습니다. 마찬가지로 속성 값을 조회할 때는 리플렉션의 GetProperty() 메서드를 사용했습니다. 이 방식을 활용하면 컴파일 시점에 타입을 알지 못하더라도 런타임에 문자열로 전달된 속성 이름만으로 어떤 속성이든 자유롭게 읽고 쓸 수 있습니다.
다만 리플렉션은 일반적인 직접 접근 방식보다 성능 오버헤드가 크기 때문에, 직렬화·ORM 매핑·플러그인 구조처럼 런타임 유연성이 꼭 필요한 경우에 사용하는 것이 좋습니다.