2013-11-02 34 views
0

我有一個名爲Widget的父類。我有一個我存儲的Widgets列表。在此列表中,我存儲Widget的子項,如Button,Label,DropDown等。在我的編輯器中選擇一個子項時,我將該對象(通過Widgets列表中的名稱查找)分配給PropertyGrid。但是,由於它們存儲爲Widget類型,因此PropertyGrd僅顯示Widget屬性。 當我將它設置爲PropertyGrid時,我想要將其子類Widget強制轉換爲實際類型,以便PropertyGrid可以看到該子類的屬性,但是我想動態地執行此操作,而不是使用if/case語句,因爲子部件使用插件系統在設計時我不知道類型是什麼。我知道我必須使用反射,我很好,但我只是不知道如何做到這一點。C#屬性網格的動態投射對象

由於我將子窗口小部件存儲在父窗口小部件的容器中,因此子窗口將作爲窗口小部件存儲?這意味着PropertyGrid只能看到Widget屬性?

Dictionary<string, Widget> Widgets; 

Widgets.Add("button1", new Button()); // gets converted to parent Widget 

PropGrid.SelectedObject = Widgets["button1"]; 


public class Button : Widget.Widget 
{ 
    public String Test { get; set; } // this doesn't show up in the property grid 
} 
+0

請提供一些代碼。 – ataravati

+0

你可以顯示一個不顯示的示例屬性嗎?如果你的代碼如Tim的答案所示,它應該已經可以工作 - 所以一個例子會有所幫助。另外:這是winforms嗎? WPF?要麼...? –

+0

@MarcGravell'PropertyGrid'是一個winforms類。我已經添加了該標籤。 –

回答

3

我假設你有一些像這樣的代碼:

myPropertyGrid.SelectedObject = widget; 

由於SelectedObject屬性爲object型的,也不要緊你是否爲其分配一個靜態稱爲對象object,WidgetButton:它將作爲object收錄。由於其他原因,您的孩子沒有出現。

+0

但我存儲像Dictionary Widgets這樣的對象;所以,當我添加一個按鈕,例如它存儲爲一個Widget,因爲我這樣做:Widgets.Add(「button1」,new Button());所以當它被存儲在容器中時,它被轉換爲Widget,這意味着當我將它拉出時它仍然是Widget類型的,不是嗎?無論如何,這就是它在C++中的工作方式,所以我認爲它對於C#來說是一樣的。 – user441521

+0

@ user441521當你不用轉換就把它拉出來時,它的靜態已知類型(編譯器知道的類型,你可以在鼠標懸停在「widget」上時看到的類型)是Widget,但是它的運行時類型你可以用'widget.GetType()'等等來看到)實際上是'Button'。從你的描述來看,這聽起來像C++在這方面有所不同:在運行時沒有鑄造容器說「這是一個按鈕,但我將它用作Widget」。 –

+0

只需100%清楚:在.net中,您將其指定爲「object」類型;它將使用GetType和TypeDescriptor等來了解運行時的對象。 –