2009-09-09 28 views
26

請考慮以下代碼。TypeDescriptor.GetProperties()與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 B = obj.GetType()的GetProperties();

回答

18

obj.GetType().GetProperties()不返回PropertyDescriptorCollection,它返回System.Reflection.PropertyInfo[]。正如你所建議的那樣,PropertyInfo類只代表在對象上創建的實際屬性。 A PropertyDescriptorPropertyDescriptor類的自定義具體子項(由定義自定義描述符的類型實現),或者是密封的內部類ReflectPropertyDescriptor的一個實例,該類使用PropertyInfo類提供屬性的動態調用。

因此,對於沒有定義自定義描述符的類,您將在功能上獲取相同的對象,儘管PropertyDescriptor正在抽象PropertyInfo

9

TypeDescriptor類用於設計人員,以便他們可以與設計時環境進行交互。特別是,設計人員可以覆蓋和擴展TypeDescriptor的各種功能,但不能使用Type

一個很好的例子是使用數據綁定控件。 DataSource屬性的類型爲System.Object,但在設計時,該屬性被替換爲具有更豐富的設計時UI的新屬性。

+0

它用於設計人員,但它也用於數據綁定,所以它不僅僅是一種設計時技術。 – 2009-09-09 21:53:06

7

TypeDescriptor類返回PropertyDescriptor代表obj類型屬性的對象以及對對象本身或其類型貢獻的任何其他屬性。

組件模型實際上相當複雜,但正如您所描述的那樣,TypeDescriptor.GetProperties()的基本實現將返回ReflectPropertyDescriptor實例,這些實例代表對典型的PropertyInfo對象的間接訪問。您可以使用PropertyDescriptor對象非常像PropertyInfo對象:它們可用於獲取和設置屬性的值,並且它們具有屬性。

對於WPF中的DependencyObject實例,TypeDescriptor.GetProperties()也返回附加屬性。在這種情況下,這些對象提供了對依賴對象模型的間接,而不是反射。

在組件設計器中,可以使用ICustomTypeDescriptorTypeDescriptionProviderAttribute(也可能使用其他一些技術)在運行時或在設計時創建自己的PropertyDescriptor對象。在任何情況下,根據具體情況,從Type.GetProperties()返回的屬性可能與從TypeDescriptor返回的屬性非常不同。

相關問題