리플렉션이란?
- 실행 중에 객체의 클래스나, 형식 정보 등을 열어볼 수 있다.
- 위에서 확인한 클래스, 형식 정보를 이용해서, 메서드를 호출, 특정 값을 불러오거나 할당할 수 있다.
- 클래스, 메서드가 public이 아니더라도 위의 작업을 수행할 수 있다.
- 실행 중에 불러오고, 할당한 메서드를, 값을 동적으로 사용할 수 있다.
리플렉션 사용방법
- System.Reflection 네임스페이스를 정의 해준다.
- 가져올 대상의 형식 정보를 가져온다.
- System.Object의 GetType 메서드를 통해서 객체의 형식 정보를 확인하고, Type 객체를 반환한다. System.Object는 모든 자료형의 최상위 부모 클래스로서 Object의 메서드인 GetType은 어느 형식 정보든지 사용이 가능하다.
- 타입 연산자 typeof를 이용해서 객체의 형식 정보를 확인하고 System.Type 인스턴스를 반환한다. 타입 연산자는 GetType보다는 빠르게 코드를 생성한다.
- 가져온 형식 정보에서, 필요한 멤버를 가져온다.
- 리플렉션 사용
- Activator.CreatInstance로 형식 정보와 같은 유형의 인스턴스를 만들고 나서, 프로퍼티를 조작하거나, Invoke를 이용해서 메서드를 호출할 수 있다.
- GetField(), GetMethods()는 형식 타입을 검사한다. 결과 값으로는 public, 비 public, static, 인스턴스 항목을 조건으로 하여서 조회할 수 있다.
- 위의 검색 조건은 System.Reflection.BindingFlags 열거형으로 구성된다.
- BindingFlags는 리플렉션의 검색 범위 및 조건을 결정한다.
| 메서드 |
반환 형식 |
설명 |
| GetConstructors() |
ConstruectorInfo[] |
모든 생성자 목록 반환 |
| GetEvents() |
EventInfo[] |
이벤트 목록 반환 |
| GetFields() |
FieldInfo[] |
필드 목록 반환 |
| GetGenericArguments() |
Type[] |
형식 매개 변수 목록 반환 |
| GetInterfaces() |
Type[] |
상속하는 인터페이스 목록 반환 |
| GetMemebers() |
MemberInfo[] |
멤버 목록 반환 |
| GetMethods() |
MemberInfo[] |
메서드 목록 반환 |
| GetNestedTypes() |
Type[] |
내장 형식 목록 반환 |
| GetProperties() |
PropertyInfo[] |
프로퍼티 목록 반환 |
| GetEnumValues()0 |
Array |
Enum의 배열 목록 반환 |
리플렉션의 단점
- Visual studio에서 디버그를 잡아주지 않는다.
- 가독성이 많이 떨어진다
- 인스턴스를 넣어 실행하기에 성능에 많은 영향을 끼친다.
예시 코드