.NET에서의 리플렉션

System.Reflection 네임스페이스의 클래스와 System.Type을 함께 사용하여 로드된 어셈블리 및 해당 어셈블리 내에 정의된 형식(예: 클래스, 인터페이스, 값 형식(즉, 구조체열거형))에 대한 정보를 가져올 수 있습니다. 리플렉션을 사용하여 런타임에 형식 인스턴스를 만들고 이 인스턴스를 호출 및 액세스할 수도 있습니다.

어셈블리에는 모듈이 포함되고, 모듈에는 형식이 포함되고, 형식에는 멤버가 포함됩니다. 리플렉션은 어셈블리, 모듈 및 형식을 캡슐화하는 개체를 제공합니다. 리플렉션을 사용하여 동적으로 형식 인스턴스를 만들거나, 형식을 기존 개체에 바인딩하거나, 기존 개체에서 형식을 가져올 수 있습니다. 그리고 나서 해당 형식의 메서드를 호출하거나 필드 및 속성에 액세스할 수 있습니다. 리플렉션의 일반적인 용도는 다음과 같습니다.

  • Assembly를 사용하여 어셈블리를 정의 및 로드하고, 어셈블리 매니페스트에 나열된 모듈을 로드하고, 이 어셈블리에서 형식을 찾아 해당 인스턴스를 만듭니다.
  • Module을 사용하여 모듈 및 모듈의 클래스가 포함된 어셈블리와 같은 정보를 검색합니다. 모듈에 정의된 모든 전역 메서드나 기타 특정 비전역 메서드를 가져올 수도 있습니다.
  • ConstructorInfo를 사용하여 생성자의 이름, 매개 변수, 액세스 한정자(예: public 또는 private), 구현 세부 정보(예: abstract 또는 virtual)와 같은 정보를 검색합니다. TypeGetConstructors 또는 GetConstructor 메서드를 사용하여 특정 생성자를 호출합니다.
  • 메서드의 이름, 반환 형식, 매개 변수, 액세스 한정자 및 구현 세부 정보(예: 또는virtual)와 같은 abstract 정보를 검색하는 데 사용합니다MethodInfo. TypeGetMethods 또는 GetMethod 메서드를 사용하여 특정 메서드를 호출합니다.
  • 필드의 이름, 액세스 한정자 및 구현 세부 정보(예: static)와 같은 정보를 검색하고 필드 값을 얻거나 설정하는 데 사용합니다FieldInfo.
  • EventInfo를 사용하여 이벤트의 이름, 이벤트 처리기 데이터 형식, 사용자 지정 특성, 선언 형식, 리플렉션 형식과 같은 정보를 검색하고 이벤트 처리기를 추가하거나 제거합니다.
  • PropertyInfo를 사용하여 속성의 이름, 데이터 형식, 선언 형식, 리플렉션 형식, 읽기 전용/쓰기 가능 상태와 같은 정보를 검색하고 속성 값을 가져오거나 설정합니다.
  • ParameterInfo를 사용하여 매개 변수 이름, 데이터 형식, 매개 변수가 입력 또는 출력 매개 변수인지 여부, 메서드 서명에서 매개 변수의 위치와 같은 정보를 검색합니다.
  • 리플렉션 전용 컨텍스트(.NET Framework)에서 작업할 때 사용자 지정 특성에 MetadataLoadContext 대한 정보를 검색하는 데 사용합니다CustomAttributeData. CustomAttributeData를 사용하면 특성 인스턴스를 만들지 않고 특성을 검사할 수 있습니다.

System.Reflection.Emit 네임스페이스의 클래스는 런타임에 빌드할 수 있는 특수한 형태의 리플렉션을 제공합니다.

리플렉션을 사용하여 형식 브라우저를 만들면 사용자가 형식을 선택한 다음 해당 형식에 대한 정보를 볼 수 있습니다.

리플렉션의 다른 용도는 다음과 같습니다. JScript와 같은 언어용 컴파일러에서는 리플렉션을 사용하여 기호 테이블을 생성합니다. System.Runtime.Serialization 네임스페이스의 클래스에서는 리플렉션을 사용하여 데이터에 액세스하고 보관할 필드를 결정합니다. System.Runtime.Remoting 네임스페이스의 클래스에서는 직렬화를 통해 간접적으로 리플렉션을 사용합니다.

리플렉션의 런타임 형식

리플렉션은 형식, 멤버, 매개 변수, 기타 코드 엔터티를 나타내는 TypeMethodInfo와 같은 클래스를 제공합니다. 하지만 리플렉션을 사용할 때 이들 클래스를 직접 사용하지 않습니다. 이들 클래스는 대부분 추상 클래스입니다(Visual Basic의 MustInherit). 대신에 CLR(공용 언어 런타임)에서 제공된 형식을 사용합니다.

예를 들어 C# typeof 연산자(Visual Basic의 GetType)를 사용하여 Type 개체를 가져오면 개체가 실제로 RuntimeType입니다. RuntimeTypeType에서 파생되고 모든 추상 메서드의 구현을 제공합니다.

이들 런타임 클래스는 internal(Visual Basic의 Friend)입니다. 이들 클래스의 동작은 기본 클래스 설명서에서 설명되므로 이들 클래스는 기본 클래스와 별도로 설명되지 않습니다.

참조