Я хочу преобразовать как объекты MenuItem, так и объекты управления Button к типу объекта, свойство «Tag» которого я могу ссылаться.
Есть ли такой тип объекта?
Например.
void itemClick(object sender, EventArgs e)
{
Control c = (Control)sender;
MethodInvoker method = new MethodInvoker(c.Tag.ToString(), "Execute");
method.Invoke();
}
За исключением того, что это не удается - «Невозможно преобразовать тип объекта 'System.Windows.Forms.MenuItem' к типу 'System.Windows.Forms.Control'
Чем можно заменить Control в этом примере?





Контроль - это то, что вы ищете.
путь наследования отличается для MenuItem и Button, нет общего / унаследованного свойства Tag.
MenuItem наследуется от Menu, которое объявляет свойство Tag, Button наследует от Control, которое также реализует свойство Tag. У вас должна быть возможность преобразовать MenuItem и Button в Component, но это вам не поможет, поскольку свойство Tag объявлено в упомянутых мною производных классах (меню и элемент управления).
В этом конкретном случае вам, вероятно, потребуется использовать отражение, а не наследование. Или придумайте план Б
Пишу без IDE.
object myControlOrMenu = sender as MenuItem ?? sender as Button;
if (myControlOrMenu == null)
// neither of button or menuitem
Используйте оператор «как».
object tag;
Button button;
MenuItem menuItem = sender as MenuItem;
if (menuItem != null)
{
tag = menuItem.Tag;
}
else if ( (button = sender as Button) != null )
{
tag = button.Tag;
}
else
{
//not button nor MenuItem
}
Извините моя ошибка. Пример теперь содержит элемент управления, так как это тоже не работает. Я уже пробовал это раньше.