2009-09-09 5 views
26

Rozważ następujący kod.TypeDescriptor.GetProperties() vs Type.GetProperties()

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

Próbuję zrozumieć różnicę między A i B. Z tego co rozumiem TypeDescriptor.GetProperties() powróci niestandardowej TypeDescriptor właściwości, gdzie jako Type.GetProperties() będzie tylko zwraca wewnętrzne "rzeczywiste" właściwości obiektu. Czy to jest poprawne? Jeśli obiekt nie ma żadnych niestandardowych właściwości TypeDescriptor, to po prostu domyślnie zwraca również dosłowne właściwości wewnętrzne obiektu. .


* oryginalny sekund linii kodu przed edycji (miała błędną wartość powrotną):

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

Odpowiedz

18

obj.GetType().GetProperties() nie zwraca wartości PropertyDescriptorCollection, zwraca wartość System.Reflection.PropertyInfo[]. Klasa PropertyInfo ma, jak sugerujesz, reprezentować tylko rzeczywiste właściwości utworzone na obiekcie. A PropertyDescriptor jest niestandardowym dzieckiem potomnym klasy PropertyDescriptor (zaimplementowanym przez typ definiujący niestandardowy deskryptor) lub instancją zamkniętej klasy wewnętrznej ReflectPropertyDescriptor, która używa klasy PropertyInfo w celu zapewnienia dynamicznego wywoływania właściwości.

Tak więc dla klasy, która nie definiuje niestandardowego deskryptora, funkcjonalnie odzyskasz te same obiekty, jednak PropertyDescriptor odbiera wartość PropertyInfo.

9

Klasa TypeDescriptor jest używana w projektancie, dzięki czemu mogą wchodzić w interakcje ze środowiskiem projektowym. W szczególności projektanci mogą przesłonić i rozszerzyć różne funkcje TypeDescriptor, ale nie Type.

Dobrym przykładem jest praca z kontrolkami związanymi z danymi. Właściwość DataSource jest typu System.Object, ale w czasie projektowania ta właściwość jest zastępowana nową właściwością, która ma bogatszy interfejs użytkownika w czasie projektowania.

+0

Jest używany w projektancie, ale jest również używany do wiązania danych, więc nie jest to tylko technologia czasu projektowania. –

7

Klasa TypeDescriptor zwraca PropertyDescriptor obiektów reprezentujących właściwości w rodzaju obj, a także wszelkie inne właściwości, które zostały wniesione do samego obiektu lub do jego typu.

Model komponentu jest w rzeczywistości dość skomplikowany, ale zgodnie z opisem podstawowa implementacja TypeDescriptor.GetProperties() zwróci instancje ReflectPropertyDescriptor reprezentujące obiekt pośredni do typowych obiektów . Możesz używać obiektów o bardzo podobnej tematyce, jak obiekty PropertyInfo: mogą one służyć do uzyskiwania i ustawiania wartości właściwości i mają atrybuty.

Dla DependencyObject wystąpień w WPF, TypeDescriptor.GetProperties() również zwraca załączone właściwości. Te obiekty w tym przypadku zapewniają raczej kierunek pośredni do modelu obiektu zależności niż do odbicia.

W projektanta komponentów, możliwe jest użycie ICustomTypeDescriptor lub TypeDescriptionProviderAttribute (a może jakieś inne techniki), aby tworzyć własne PropertyDescriptor obiektów w czasie wykonywania lub w designtime. W każdym razie możliwe jest, że właściwości zwrócone z Type.GetProperties() mogą bardzo różnić się od tych zwróconych z TypeDescriptor, w zależności od kontekstu.