2011-04-23 41 views
5

我想使用ExpandoObject作爲PropertyGrid的SelectedObject。我知道如何我想要的屬性添加到ExpandoObject:是否可以向ExpandoObject實例的生成成員添加屬性?

public dynamic MakePropertyObject() 
{ 
    dynamic expando = new ExpandoObject(); 
    var dictionary = expando as IDictionary<string, object>; 
    foreach(MyClass m in PropertiesINeedToAdd) 
     dictionary[m.Name] = m.Value; 
    return expando; 
} 

此代碼的工作精細調試器顯示expando的屬性的名稱和值如預期。

但是,當我將MakePropertyObject()的返回值設置爲其SelectedObject屬性時,PropertyGrid中沒有顯示生成的屬性。我假設(這可能是錯誤的),這是因爲ExpandoObject的屬性沒有任何DisplayNameAttribute,DescriptionAttribute或用於控制屬性在PropertyGrid中的顯示方式的任何其他屬性。

我已經做了一些閱讀和一些谷歌搜索,我不知道是否有一種方法來裝飾自定義屬性ExpandoObject生成的屬性。有沒有人知道如何做到這一點,或者更好的方式在PropertyGrid中顯示ExpandoObject

SOLUTION:

由@Stephen克利裏提供的答案是正確的和有幫助的(感謝,斯蒂芬)。對於有同樣問題的其他人,實施ICustomTypeDescriptor對我來說非常合適。

作爲一個側面說明,實現ICustomTypeDescriptor的對象提供了屬性和事件描述符本身,而不是另一個對象。我認爲描述符和描述應該首先通過一個屬性或某種東西相關聯 - 對於我來說,一個對象應該描述它自己的類型似乎令人困惑和多餘,但這確實是如何使用ICustomTypeDescriptor接口的。

回答

6

問題實際上是反射在預期的動態類型上無法正常工作。

PropertyGrid使用反射來檢查其對象的屬性,ExpandoObject沒有任何(靜態)屬性。

您可以實現ICustomTypeDescriptor以「劫持」反射並查詢ExpandoObject的(動態)屬性。代碼DynamicTypeDescriptorWrapperthis blog post將是一個很好的起點。

相關問題