2013-10-07 64 views
1

我創建了一個實現ICustomTypeDescriptor的泛型類Group。 它只是將泛型類型參數的屬性添加到它自己的屬性中。爲什麼TypeDescriptor.GetProperties在處理ICustomTypeDescriptor時表現出不同的類型和對象

private void InitializeDisplayedProperties() 
    { 
     _DisplayedProperties.Add(TypeDescriptor.GetProperties(typeof(Group<T>))["LastItem"]); 
     _DisplayedProperties.Add(TypeDescriptor.GetProperties(typeof(Group<T>))["GroupId"]); 
     _DisplayedProperties.Add(TypeDescriptor.GetProperties(typeof(Group<T>))["Count"]); 

     foreach (PropertyDescriptor myDescr in TypeDescriptor.GetProperties(typeof(T))) 
     { 
      _DisplayedProperties.Add(myDescr); 
     } 
    } 

爲什麼下面的代碼行爲不同?

TypeDescriptor.GetProperties(typeof(Group<IGroupedObject>)).Count //Returns 3 Items of Group only 
TypeDescriptor.GetProperties(new Group<IGroupedObject>()).Count //Returns all 31 Items of Group and generic type parameter 

我認爲這必須與這些屬性是在對象的實例時間生成的事實有關。但是,不是已使用類型定義的屬性數量?

是否有可能在不實例化類型的情況下解決此問題?

回答

1

我假設你的實際類型 implements ICustomTypeDescriptor;如果是這樣的話,那麼只有TypeDescriptor.GetProperties(object) API可以訪問數據,因爲它不願意創建一個臨時實例來獲取這些屬性(事實上,如果類型實現ICustomTypeDescriptor,屬性很常見,屬性無論如何,它不會有用)。

如果您想要整個類型支持此操作,您需要創建並註冊TypeDescriptionProvider。這在更高級別上工作,並允許自定義屬性應用於該類型,而無需考慮實例。關於這一點的好處是,它將自動適用於列表等,而無需執行ITypedList

所以基本上:研究TypeDescriptionProvider

+0

TypeDescriptionProvider似乎是正確的選擇。但是,在嘗試實現它時,由於我的InitializeDisplayedProperties方法(由構造函數調用)中的循環引用產生了未終止的遞歸,因爲我依靠組自己的默認TypeDescriptor來獲取其3個原始PropertyDescriptor。是否有解決方案來訪問原始PropertyDescriptors而不依賴於現在被重寫的TypeDescriptor for Group? – Marwie

+1

@Marwie是的 - 你早期把它們鏈接起來;有關此示例,請參閱HyperDescriptor –

相關問題