簡體   English   中英

TypeDescriptor.GetProperties()vs Type.GetProperties()

[英]TypeDescriptor.GetProperties() vs Type.GetProperties()

請考慮以下代碼。

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

我試圖理解A和B之間的區別。根據我的理解, TypeDescriptor.GetProperties()將返回自定義的TypeDescriptor屬性,其中Type.GetProperties()將只返回對象的內在“真實”屬性。 這是正確的嗎? 如果obj沒有任何自定義TypeDescriptor屬性,那么它只是默認返回對象的文字內在屬性。


* EDIT之前的原始第二行代碼(返回值錯誤):

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

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

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

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

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

TypeDescriptor類返回PropertyDescriptor對象,這些對象表示obj類型中的屬性以及提供給對象本身或其類型的任何其他屬性。

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

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

在組件設計器中,可以使用ICustomTypeDescriptorTypeDescriptionProviderAttribute (可能還有一些其他技術)在運行時或設計時創建自己的PropertyDescriptor對象。 在任何情況下,從Type.GetProperties()返回的屬性可能與TypeDescriptor返回的屬性有很大不同,具體取決於上下文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM