16. Reflection & Attribute
- 객체 정보를 데이터화
: 프로그램 실행 중에 형식 이름, 프로퍼티 목록, 메소드 목록, 필드, 이벤트 목록 등 읽을 수 있다
- 리플렉션 다형성
: 읽어들인 형식의 인스턴스를 만들고 프로퍼티나 필드에 값을 할당하고, 메소드를 호출할 수 있다
- 리플렉션 내보내기
: 프로그램 실행 중에 새로운 형식을 만들어낼 수 있다
- 에트리뷰트
: 리플렉션 값 사용
16.1. Object.GetType()
: 객체의 메타데이터를 리턴한다.
- Object 클래스
: Object는 모든 데이터 형식의 조상
: 즉, 모든 Type 은 Object 형식이다.
- Object 클래스의 메서드
: 반드시 인스턴스 필요(클래스 X)
: Object.Equals( )
: Object.GetHashCode( )
: Object.GetType( )
: Object.ReferenceEquals( )
: Object.ToString( )
- Object.GetType( )
: Type information return
: 형식 이름, 소속된 어셈블리 이름, 프로퍼티 목록, 메소드 목록, 필드 목록, 이벤트 목록, 인터페이스의 목록 등
- System.Type
: 리턴된 Type Information 을 담는다.
- System.Reflection.BindingFlags 열거형
: public 항목만 조회, 비(非) public 항목만 조회, static 항목만 조회 등
16.2. 리플랙션 동적 생성
: 리플렉션으로 인스턴스를 만들고, 프로퍼티와 필드에 값을 할당하고, 메소드를 호출하는 방법
- 객체 생성
: System. Activator.CreateInstance( )
- 프로퍼티 가져오기
: PropertyInfo.SetValue(), : PropertyInfo.GetValue()
: Type.GetProperties( ): 모든 프로퍼티를 PropertyInfo 배열 저장
: Type.GetProperty("Name"): Name 에 해당하는 프로퍼티를 PropertyInfo 변수 저장
- 메서드 호출
: MethodInfo.Invoke(Instance, Arguments)
- 형식 내보내기
: System.reflection.Emit
: *~Builder와 ILGenerator
- 동적 생성 순서
① AssemblyBuilder를 이용해서 어셈블리를 만듭니다.
② ModuleBuilder를 이용해서 ①에서 생성한 어셈블리 안에 모듈을 만들어 넣습니다.
③ ②에서 생성한 모듈 안에 TypeBuilder로 클래스(형식)를 만들어 넣습니다.
④ ③에서 생성한 클래스 안에 메소드(MethodBuilder 이용)나 프로퍼티(PropertyBuilder 이용)를 만들어 넣 습니다.
⑤ ④에서 생성한 것이 메소드라면, ILGenerator를 이용해서 메소드 안에 CPU가 실행할 IL 명령들을 넣습니다.
16.3. Attribute
- 코드에 대한 부가 정보를 기록하고 읽을 수 있는 기능
- 주석
: 사람이 작성, 사람이 읽음
- 애트리뷰트
: 사람이 작성, 컴퓨터가 읽음
- Caller Information Attribute
: C# 5.0 버전
- 사용자 정의 에트리뷰트
: .NET - Obsolete, DLL(Dynamic Link Library) 호출 - [DLLImport], 조건부-[Conditional] 등
: 부가 정보이지 핵심 내용이 아니다
: 애트리뷰트도 하나의 클래스다
- System.AttributeUsage
: 애트리뷰트의 애트리뷰트
17. Dynamic
: dynamic 형식은 검사를 하는 시점이 프로그램 실행 중이다
17.1. Duck Timing
: 인터페이스, 추상과 동일한 기능
: 상속 관계를 이용하지 않기에 프로그램의 동작 부분만 수정 후 사용 가능
17.2. COM .NET dynamic
- COM(Component Object Model)
17.3. 동적 언어와 상호 운용
: C# 코드에서 직접 파이썬이나 루비 코드를 실행하고 그 결과를 받아볼 수 있다
: DLR(Dynamic Language Runtime): 동적 언어 실행 플랫폼 (JSP, Servlet 느낌)
: DLR API를 기반으로 구현된 동적 언어라도 호스팅(Hosting) 가능
: 미리 형식 검사를 할 수 없는 동적 형식 언어에서 만들어진 객체를 C#의 dynamic 형식이 받는다
- DLR 제공 클래스