형식 설명자 개요

TypeDescriptor 아키텍처는 .NET 리플렉션 기능을 향상시킵니다.

형식 설명자 아키텍처

TypeDescriptor 아키텍처는 핵심 리플렉션 엔진 위에 구축되며 새 규칙과 기능을 추가합니다. 예를 들어, TypeDescriptor 클래스는 IContainer에서 Extender 속성 병합을 지원하며 IDesigner를 통한 속성 및 이벤트 필터링도 지원합니다.

또한 TypeDescriptor 아키텍처에서는 여러 기능을 사용할 수 있습니다. 다음 표에서는 아키텍처의 기능을 설명합니다.

기능

설명

인스턴스 대체

다른 형식이 요청될 때 임의의 형식을 만들 수 있게 합니다.

메타데이터 대체

개체의 메타데이터를 수정할 수 있게 합니다.

특성 리디렉션

특성을 동적으로 지정할 수 있게 합니다.

대상 대체 및 숨김

하나의 개체가 다른 개체를 대신할 수 있게 합니다.

확장 형식 설명자 지원

다른 개체에서 추가한 개체 속성에 액세스할 수 있게 합니다.

이러한 기능을 지원하려면 TypeDescriptor 클래스가 .NET Framework 구성 요소 모델의 다양한 기능과 완벽하게 통합됩니다. 이 아키텍처는 COM 개체, Extender 공급자, 디자이너 및 CLR 속성과 호환됩니다.

참고

디자인 타임 코드뿐 아니라 런타임 코드에서 TypeDescriptor 아키텍처를 사용할 수 있습니다.

확장성을 지원하려면 TypeDescriptor 클래스에는 TypeDescriptionProvider라는 자매 클래스와 TypeDescriptionProviderAttribute라는 자매 특성이 포함되어 있습니다. 클래스의 TypeDescriptionProviderAttribute를 사용하면 디자인 목표에 맞는 메타데이터를 완전히 다른 방법으로 노출할 수 있습니다.

TypeDescriptionProvider 클래스

TypeDescriptionProvider 클래스는 TypeDescriptor 클래스의 플러그 인으로 간주할 수 있습니다. TypeDescriptor의 특정 인스턴스에 대해 여러 개의 형식 설명 공급자 클래스가 있을 수 있으며 모든 클래스는 TypeDescriptor에 메타데이터를 제공합니다.

TypeDescriptionProvider 특성

TypeDescriptionProviderAttribute는 클래스에 배치할 수 있는 특성입니다. 이 특성은 형식에 사용자 지정 형식 설명 공급자가 연결되어 있음을 나타낼 때 사용됩니다. 그 다음 이 특성은 메타데이터를 통해 형식 설명 공급자를 설치하는 방법을 제공합니다. 이 형식이 TypeDescriptor 클래스의 API로 전달되면 TypeDescriptor는 이 특성을 검색하고 이 특성에 설명된 형식 설명 공급자의 인스턴스를 만든 다음 이 공급자를 TypeDescriptor의 내부 테이블에 후크합니다. 이 작업을 마치면 TypeDescriptor는 API를 계속 처리합니다. 이 처리를 통해 형식은 사용자 지정 형식 설명 공급자를 필요 시 자동으로 설치할 수 있습니다.

형식 설명자 기능

TypeDescriptor 아키텍처는 .NET Framework 리플렉션에서 제공하는 것 이외의 기능을 사용할 수 있게 합니다.

인스턴스 대체

어떤 형식을 만들고 싶은데 실제로 만들어진 형식이 요청한 형식과 다를 경우 인스턴스 대체가 발생합니다. new에 대한 모든 호출을 CreateInstance 메서드에 대한 호출로 대체할 때 인스턴스 대체 작업이 수행됩니다. 이 메서드는 TypeDescriptor 내의 내부 테이블에서 지정된 데이터 형식과 연결된 TypeDescriptionProvider 개체를 검색합니다. 개체를 찾으면 이것으로 해당 개체에 대한 호출을 위임합니다.

메타데이터 대체

하나 이상의 개체에 사용할 수 있는 메타데이터를 수정하려는 경우 메타데이터 대체가 발생합니다. 메타데이터 대체는 일반적으로 디자이너 구현에서 사용됩니다. 메타데이터 대체는 형식 설명 공급자를 사용하여 수행할 수 있으며, 형식 설명 공급자는 TypeDescriptor의 다음 메서드를 사용하여 추가하거나 제거할 수 있습니다.

특성 리디렉션

NET Framework 개체 모델에서는 드문 경우지만 속성의 형식을 일부러 지정하지 않았습니다. 예를 들어, DataGridView 클래스의 DataSource 속성이 object 형식으로 지정될 수 있습니다. 이 디자인에서는 여러 종류의 입력 데이터 소스를 허용하지만, 속성의 특징을 설명하는 메타데이터를 추가할 수 있는 공통 위치를 제공하지 않습니다. .NET Framework 전체에서 각 데이터 소스 속성은 형식 변환기와 UI(사용자 인터페이스) 형식 편집기에 대해 동일한 메타데이터를 가져야 합니다.

AttributeProviderAttribute 클래스는 이 문제를 해결합니다. 속성에 이 특성이 배치되면 속성 설명자의 Attributes 컬렉션에 대한 특성을 가져오기 위해 규칙이 변경됩니다. 일반적으로 속성 설명자는 로컬 특성을 수집하여 해당 속성 형식의 특성과 병합합니다. AttributeProviderAttribute 특성이 적용될 때 이 특성은 실제 속성 형식이 아닌 AttributeProviderAttribute에서 반환된 형식에서 가져옵니다. AttributeProviderAttribute가 데이터 소스에서 사용되어 데이터 소스의 특정 형식이 IListSource를 가리키게 하고, 적절한 메타데이터가 IListSource에 배치되어 데이터 바인딩을 사용할 수 있게 됩니다. 이러한 리디렉션을 통해 Visual Studio와 같은 외부 프로그램에서 모든 데이터 소스에 대한 메타데이터를 쉽게 추가할 수 있습니다.

AttributeProviderAttribute에 선언된 형식에서 얻은 특성의 우선 순위는 속성 형식의 특성과 속성 수준의 특성 사이에 옵니다. 사용 가능한 모든 특성 집합은 다음 목록에 표시된 우선 순위에 따라 병합됩니다.

  1. 속성 특성

  2. 특성 공급자 특성

  3. 속성 형식 특성

대상 대체 및 숨김

한 개체가 다른 개체를 대신할 때 대상 대체가 발생합니다. 대상 대체는 일반적으로 디자이너 구현에서 사용됩니다.

.NET Framework 디자이너 아키텍처에서 구성 요소에는 디자이너가 연결될 수 있습니다. 이 디자이너는 IDesignerFilter를 구현하고 자체의 속성을 제공할 수 있습니다. 이 속성은 디자이너가 연결된 구성 요소의 속성 집합에 병합됩니다. 이 속성은 구성 요소에 새로운 속성일 수도 있고 구성 요소에 이미 정의된 속성과 이름과 형식이 같을 수도 있습니다. 새 속성이 기존 속성과 이름 및 형식이 같은 경우 디자이너가 구성 요소에서 기존 속성을 숨기므로 이를 숨김라고 합니다. 다음 그림에서는 속성 숨김을 보여 줍니다.

텍스트 속성 숨기기

여기서 구성 요소가 두 가지 속성을 제공하고 디자이너도 두 가지 속성을 제공합니다. Text 속성은 디자이너와 구성 요소 모두에서 제공되므로 숨겨집니다. GetProperties를 호출한 최종 결과는 세 개의 속성입니다. 하나는 구성 요소에 있고 나머지 두 개는 디자이너에 있습니다.

이러한 속성 필터링은 디자인 화면에서 구현되는 ITypeDescriptorFilterService를 사용하여 수행됩니다. 속성의 값을 설정할 때는 TypeDescriptor 기능이 필요합니다. Grid 속성의 값을 설정하는 코드는 다음과 같습니다.

    gridProp.SetValue(component, value);

속성에 대한 실제 형식 정보는 구성 요소가 아닌 디자이너 인스턴스를 가리킵니다. 속성을 실제로 설정하기 위해 리플렉션을 사용하여 호출한 경우에는 구성 요소 인스턴스가 디자이너 형식과 일치하지 않기 때문에 대상 호출 예외를 발생시킵니다.

TypeDescriptor 클래스에는 이 문제를 해결하기 위한 고유한 논리가 있습니다. 속성 호출이 이루어지면 TypeDescriptor 클래스는 멤버 형식이 전달된 개체의 인스턴스인지 확인합니다. 그럴 경우 호출은 계속 수행될 수 있습니다. 그렇지 않은 경우 클래스는 개체의 디자이너를 찾습니다. 디자이너가 있으며 올바른 형식이면 클래스는 구성 요소 인스턴스를 디자이너 인스턴스로 바꿉니다.

TypeDescriptor의 다음 메서드에서 대상 대체를 지원합니다.

확장 형식 설명자 지원

GetExtendedTypeDescriptor 메서드는 지정된 개체에 대한 확장된 사용자 지정 형식 설명자를 반환합니다. 확장 형식 설명자는 사용자 지정 형식 설명자로서 다른 개체가 이 개체에 추가한 속성을 제공하지만 실제로 이 개체에 대해 정의하지 않았습니다. 예를 들어, .NET Framework 구성 요소 모델에서 IExtenderProvider 인터페이스를 구현하는 개체는 동일한 IContainer에 있는 다른 개체에 속성을 연결할 수 있습니다. GetTypeDescriptor 메서드는 이러한 추가 확장 속성을 제공하는 형식 설명자를 반환하지 않지만, GetExtendedTypeDescriptor는 이러한 확장 속성 집합을 반환합니다. TypeDescriptor 클래스는 이 두 속성 컬렉션의 결과를 자동으로 병합합니다.

참고

.NET Framework 구성 요소 모델은 확장 속성만 지원하지만, GetExtendedTypeDescriptor는 형식 설명 공급자가 지원하는 경우 확장 특성과 이벤트에서도 사용할 수 있습니다.

참고 항목

참조

TypeDescriptor

TypeDescriptionProvider

TypeDescriptionProviderAttribute

ICustomTypeDescriptor

CustomTypeDescriptor

IContainer

IDesigner

기타 리소스

디자인 타임 지원 확장