2013-03-01 68 views
0

我陷入了一點沼澤,因爲我找不到足夠簡單的方法來檢測繼承的用戶控件。 基本上,我有一個用戶控制「UC」,檢測繼承的用戶控件

public partial class UC : UserControl 

其將作爲一種模板共同性質的;

和一些遺傳性的用戶控件(「UC1」,「UC2」,「UC3」,等...)

public partial class uc1 : UC 

*目的是列出遺傳控制以及根據容器板扔在裏面。

我的問題:我可檢測/計數/一一列舉了一些簡單的方式(不超過20行代碼的東西),還是可以在所有的呢?

任何意見讚賞。

開發IR培訓:d

回答

1

嘗試類似這樣的事情(這將遍歷所有現有的程序集,而不是那些沒有' t已經被加載了,我還建議做一些比這更優雅的事情,這樣做會讓你更加了解你實際上需要做的事情,這只是一種蠻力(並且它也花費時間和資源,所以只能運行一次,而不是每一毫秒)):

var query = from assembly in AppDomain.CurrentDomain.GetAssemblies() 
      from type in assembly.GetTypes() 
      where typeof(UC).IsAssignableFrom(type) && (type != typeof(UC)) 
      let ctor = type.GetConstructor(Type.EmptyTypes) 
      where ctor != null 
      select type; 

foreach (var type in query) {     
    var control = Activator.CreateInstance(type, nonPublic: true) as UC; 
    control.Parent = thePanel; 
} 

但是邏輯缺陷這裏要注意:每一個擴展UC類將有1個例,僅1例類。另外:你將如何動態管理這些用戶控件在thePanel的位置?

+0

我會拖動它們 – 2013-03-01 10:25:04

+0

你在運行時創建了一個拖動機制**嗎?請注意,我的回答是在運行時**發生的事情。在設計時,您只會在視覺編輯器中看到一個空白麪板,等待客人(實際上等待應用程序開始運行以便客人可以到達)。另請注意,您的問題並不能消除歧義,常識會指示您正在講述應用程序中發生的情況,而不是IDE中的情況。 – 2013-03-01 10:31:47

+0

拖動機制尚未完成。 UC上會添加一個拖動控件,因此所有繼承的控件都可以擁有它。 – 2013-03-01 10:42:55

0

如果你知道,在這些控件的位置(我的意思是組裝),您可以使用使用Reflection通過對象和測試類型進行迭代。 不知道如果生成的代碼將是20或更少的代碼行,但它是我知道的唯一方法...

0

向基類添加靜態計數器。在基類的通用構造函數或init方法中調用counter ++。並在其關閉的事件呼叫計數器上。

如果您不想寫更多的代碼行,那麼保存計數器的單獨模式會更好。

+0

沒有實際接觸的靜態構造函數初始化,並永遠不會被執行的子類(懶惰的類加載和jitting)。這就是爲什麼計數器不會正確遞增的原因,因爲我明白Martins需要「不要做任何具體的事情」與子類... – 2013-03-01 10:36:27

+0

OP明確表示他想要在Init上將它們扔到面板上。我認爲他想計算實例而不是類型。但是,更好的方法是將counter ++代碼放在基礎構造函數中,所以我將編輯我的答案。 – 2013-03-01 11:31:50