2010-01-18 3 views
6

나는 많은 항목으로 MenuStrip이 이벤트에 모두 구독하도록 노력하고 그래서 menuStrip1.Items.OfType<ToolStripMenuItem>();을하려고하고 각각에 대해 나는이 수행C#을 - 사용 OfType 및 상속 무시 클래스는

menuitem.Click += new EventHandler(MenuItem_Click); 

문제는 ToolStripMenuItem을 상속 한 ToolStripSeperatorItem이 있으며 Click 이벤트가 없기 때문에 내 항목 목록과 오류입니다.

어떻게 내 OfType 메소드에 이것을 포함 할 수 있습니까? 어쩌면이 같은

+3

ToolStripSeperatorItem가 ToolStripMenuItem을 확장하고 ToolStripMenuItem은 다음 ToolStripSeperatorItem * 필수을 Click 이벤트가있는 경우 * Click 이벤트도 가지고 있지? – dtb

+4

BTW .NET Framework에는 ToolStripSeperatorItem이없고 ToolStripSeperator는 ToolStripItem이 아니라 ToolStripItem을 확장합니다. – dtb

답변

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

+0

맞습니다. 'Items' 콜렉션은'IEnumerable '이 아닌'IEnumerable' 만 구현하므로, 여전히'OfType' 호출이 필요합니다. – LukeH

2

는 :

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

당신이 캐스트와 명시 적 캐스트 다음 기본적으로 느린 암시 적 캐스트와을 비교 한 (OfType)를 필요로하지 않기 때문에