System.Reflection 네임스페이스는 애플리케이션에 대한 정보를 얻고, 타입(Type), 값(Value), 객체(Object)를 동적으로 추가할 수 있게 해주는 클래스들을 제공합니다.
리플렉션(Reflection) 객체는 런타임에 타입 정보를 얻는 데 사용되며, 실행 중인 프로그램의 메타데이터에 접근할 수 있는 클래스들이 모두 System.Reflection 네임스페이스에 포함되어 있습니다.
리플렉션의 주요 기능
리플렉션을 활용하면 다음과 같은 작업이 가능합니다.
- 런타임에 속성(Attribute) 정보를 조회할 수 있습니다.
- 어셈블리 내의 다양한 타입을 검사하고 해당 타입의 인스턴스를 생성할 수 있습니다.
- 메서드와 속성에 대해 늦은 바인딩(Late Binding)을 수행할 수 있습니다.
- 런타임에 새로운 타입을 생성하고, 그 타입을 이용해 다양한 작업을 처리할 수 있습니다.
주요 메서드 살펴보기
GetProperty(String)
지정된 이름과 일치하는 public 속성을 검색하여 PropertyInfo 객체를 반환합니다.
GetType(String, Boolean)
어셈블리 인스턴스에서 지정된 이름의 Type 객체를 가져옵니다. 두 번째 매개변수가 true이면 해당 타입을 찾지 못했을 때 예외를 발생시킵니다.
SetValue(Object, Object)
지정된 객체의 속성 값을 설정합니다. 첫 번째 매개변수는 값을 설정할 대상 객체이고, 두 번째 매개변수는 설정할 값입니다.
예제 코드
아래 예제는 리플렉션을 사용하여 User 객체의 Name 속성 값을 동적으로 설정하는 방법을 보여줍니다.
class Program{
static void Main(string[] args){
User user = new User();
Type type = user.GetType(); // 객체의 타입 정보를 가져옴
PropertyInfo prop = type.GetProperty("Name"); // "Name" 속성 검색
prop.SetValue(user, "Bangalore", null); // 속성 값 설정
System.Console.WriteLine(user.Name);
Console.ReadLine();
}
}
class User{
public int Id { get; set; }
public string Name { get; set; }
}실행 결과
Bangalore
위 코드에서 GetType() 메서드로 User 객체의 타입 정보를 얻은 후, GetProperty("Name")으로 Name 속성에 접근합니다. 이어서 SetValue()를 호출해 문자열 "Bangalore"를 속성 값으로 할당하면, 일반적인 프로퍼티 할당 방식 없이도 런타임에 동적으로 값이 설정됩니다. 이처럼 리플렉션은 컴파일 시점에 타입을 알 수 없거나 유연한 코드가 필요한 상황에서 매우 유용하게 활용됩니다.