2010-01-18 8 views
6

que tienen un MenuStrip con una gran cantidad de artículos y estoy tratando de tener en caso de que todos Suscribirse a lo que estoy tratando de hacer menuStrip1.Items.OfType<ToolStripMenuItem>(); y por cada uno me hacen esto:C# - Uso OfType e ignorar heredada clases

menuitem.Click += new EventHandler(MenuItem_Click); 

El problema es que hay un ToolStripSeperatorItem que hereda ToolStripMenuItem y que aparece es mi lista de elementos y errores porque no tiene un evento Click.

¿Cómo no puedo incluir estos en mi método OfType?

+3

Si ToolStripSeperatorItem extiende ToolStripMenuItem y ToolStripMenuItem tiene un evento Click, entonces ToolStripSeperatorItem * debe * tener un evento Click también, ¿no? – dtb

+4

BTW no hay ToolStripSeperatorItem en .NET framework, y ToolStripSeperator extiende ToolStripItem no ToolStripMenuItem. – dtb

Respuesta

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

Parece un poco redundante, pero haciendo ambas cosas, a mantener el tipo de retorno.

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

Los artículos no tienen un método Where – Jon

+0

Tienes razón. La colección 'Items' solo implementa' IEnumerable', no 'IEnumerable ', por lo que todavía necesitamos la llamada 'OfType' allí también. – LukeH

2

Tal como esto:

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

Debido a que no es necesario una conversión implícita y comparación (OfType) que es básicamente más lento que con la conversión explícita moldeada

Cuestiones relacionadas