![](/img/trans.png)
[英]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
類僅表示在對象上創建的實際屬性。 PropertyDescriptor
是PropertyDescriptor
類的自定義具體子級(由定義自定義描述符的類型實現),或者是使用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
對象提供了依賴對象模型的間接,而不是反射。
在組件設計器中,可以使用ICustomTypeDescriptor
或TypeDescriptionProviderAttribute
(可能還有一些其他技術)在運行時或設計時創建自己的PropertyDescriptor
對象。 在任何情況下,從Type.GetProperties()
返回的屬性可能與TypeDescriptor
返回的屬性有很大不同,具體取決於上下文。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.