2010-01-18 78 views
6

我有一個MenuStrip中有很多項目,我試圖對事件他們都訂閱,所以我試圖做menuStrip1.Items.OfType<ToolStripMenuItem>();併爲每一個我這樣做:C# - 使用OfType,而忽略繼承類

menuitem.Click += new EventHandler(MenuItem_Click); 

問題是有一個ToolStripSeperatorItem繼承了ToolStripMenuItem,並且出現的是我的項目和錯誤列表,因爲它沒有Click事件。

如何在我的OfType方法中不包括這些?

+3

如果ToolStripSeperatorItem延伸ToolStripMenuItem,並ToolStripMenuItem有一個Click事件,然後ToolStripSeperatorItem *必須*有一個Click事件,不是嗎? – dtb 2010-01-18 16:13:47

+4

順便提一下,.NET框架中沒有ToolStripSeperatorItem,並且ToolStripSeperator擴展ToolStripItem而不是ToolStripMenuItem。 – dtb 2010-01-18 16:14:38

回答

8
menuStrip1.Items.OfType<ToolStripMenuItem>().Where(it => it.GetType() == typeof(ToolStripMenuItem)); 

這似乎有點多餘,但通過做這兩種功能,保持返回類型。

3
menuStrip1.Items.OfType<ToolStripMenuItem>() 
       .Where(i => i.GetType() == typeof(ToolStripMenuItem)) 
+0

商品沒有Where方法 – Jon 2010-01-18 16:17:12

+0

您是對的。 'Items'集合只實現'IEnumerable',而不是'IEnumerable ',所以我們仍然需要'OfType'調用。 – LukeH 2010-01-18 16:22:41

2

也許是這樣的:

menuStrip1.Items 
    .OfType<ToolStripMenuItem>() 
    .Except(menuStrip1.Items.OfType<ToolStripSeparatorItem>()) 
0
menuStrip1.Items 
.Cast<ToolStripMenuItem>() 
.Where(i => i.GetType() == typeof(ToolStripSeparatorItem)); 

因爲你不需要隱式轉換和對比(OfType),這基本上是比較慢則顯式類型轉換的Cast