C # - использовать OfType и игнорировать унаследованные классы - PullRequest
8 голосов
/ 18 января 2010

У меня есть MenuStrip с большим количеством элементов, и я пытаюсь получить событие, на которое они все подписываются, поэтому я пытаюсь сделать menuStrip1.Items.OfType<ToolStripMenuItem>();, и для каждого я делаю это:

menuitem.Click += new EventHandler(MenuItem_Click);

Проблемаесть ли ToolStripSeperatorItem, который наследуется от ToolStripMenuItem, и отображается мой список элементов и ошибок, поскольку у него нет события Click.

Как я не могу включить их в метод OfType?

Ответы [ 4 ]

8 голосов
/ 18 января 2010
menuStrip1.Items.OfType<ToolStripMenuItem>().Where(it => it.GetType() == typeof(ToolStripMenuItem));

Это кажется излишним, но, выполняя и то, и другое, вы поддерживаете тип возвращаемого значения.

3 голосов
/ 18 января 2010
menuStrip1.Items.OfType<ToolStripMenuItem>()
                .Where(i => i.GetType() == typeof(ToolStripMenuItem))
1 голос
/ 18 января 2010

Может быть так:

menuStrip1.Items
    .OfType<ToolStripMenuItem>()
    .Except(menuStrip1.Items.OfType<ToolStripSeparatorItem>())
0 голосов
/ 18 января 2010
menuStrip1.Items
 .Cast<ToolStripMenuItem>()
 .Where(i => i.GetType() == typeof(ToolStripSeparatorItem));

Поскольку вам не нужно неявное приведение и сравнение (OfType), которое в основном медленнее, чем явное приведение с использованием Cast

...