2009-09-09 3 views
26

다음 코드를 고려하십시오.TypeDescriptor.GetProperties() vs Type.GetProperties()

Object obj; 
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj); 
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT* 

내가 TypeDescriptor.GetProperties을 이해하는 바로는 A와 B의 차이를 이해하기 위해 노력하고있어()는는 만 것입니다) 사용자 정의 에서 TypeDescriptor에게 특성 등 Type.GetProperties를 (반환 객체의 고유 한 "실제"속성을 반환합니다. 이게 옳은 거니? obj에 사용자 정의 TypeDescriptor 속성이 없으면 기본적으로 객체의 리터럴 내장 속성도 반환됩니다. . EDIT 전에 코드


* 원래초 라인 (잘못된 리턴 값했다)

PropertyDescriptorCollection obj.GetType B =()를 GetProperties를();

답변

18

obj.GetType().GetProperties()PropertyDescriptorCollection을 반환하지 않으며 System.Reflection.PropertyInfo[]을 반환합니다. PropertyInfo 클래스는 사용자가 제안한대로 객체에서 생성 된 실제 속성 만 나타냅니다. PropertyDescriptorPropertyDescriptor 클래스의 사용자 지정 구체 자식 (사용자 지정 설명자를 정의하는 형식으로 구현 됨)이거나 PropertyInfo 클래스를 사용하여 속성의 동적 호출을 제공하는 봉인 된 내부 클래스 ReflectPropertyDescriptor의 인스턴스입니다. PropertyDescriptorPropertyInfo을 멀리 추출되지만

그래서 사용자 정의 설명을 정의하지 않는 클래스, 당신은 기능적으로, 다시 같은 개체를 얻을 것이다.

9

TypeDescriptor 클래스는 디자이너에서 사용되므로 디자인 타임 환경과 상호 작용할 수 있습니다. 특히 디자이너는 TypeDescriptor의 다양한 기능을 무시하고 확장 할 수 있지만 Type은 확장 할 수 없습니다.

좋은 예는 데이터 바인딩 컨트롤을 사용하는 것입니다. DataSource 속성의 형식은 System.Object이지만 디자인 타임에는이 속성이 디자인 타임 UI가 풍부한 새 속성으로 바뀝니다.

+0

디자이너에서 사용되지만 데이터 바인딩에도 사용되므로 디자인 타임 기술이 아닙니다. –

7

TypeDescriptor 클래스는 obj 유형의 속성뿐만 아니라 개체 자체 또는 해당 형식에 기여한 속성을 나타내는 개체를 PropertyDescriptor으로 반환합니다.

구성 요소 모델은 실제로 매우 복잡하지만 설명대로 기본 구현 TypeDescriptor.GetProperties()은 개체에 대한 간접 참조를 나타내는 ReflectPropertyDescriptor 인스턴스를 반환합니다. PropertyDescriptor 개체를 PropertyInfo 개체와 매우 비슷하게 사용할 수 있습니다. 속성 값을 가져 오거나 설정하는 데 사용할 수 있으며 특성을가집니다.

WPF의 DependencyObject 인스턴스의 경우 TypeDescriptor.GetProperties()도 연결된 속성을 반환합니다. 이러한 PropertyDescriptor 개체는 리플렉션이 아닌 종속성 개체 모델에 대한 간접 지정을 제공합니다.

구성 요소 디자이너는 ICustomTypeDescriptor 또는 TypeDescriptionProviderAttribute (또는 다른 기술)을 사용하여 런타임에 또는 디자인 타임에 자신의 PropertyDescriptor 개체를 만들 수 있습니다. 어쨌든 문맥에 따라 Type.GetProperties()에서 반환 된 속성이 TypeDescriptor에서 반환 된 속성과 매우 다를 수 있습니다.

관련 문제