Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 리플렉션(Reflection)으로 속성 값을 동적으로 가져오는 방법

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 매핑·플러그인 구조처럼 런타임 유연성이 꼭 필요한 경우에 사용하는 것이 좋습니다.